C#利用异步委托实现获取线程返回值
更新时间:2023年12月13日 09:24:32 作者:rjcql
一般来说,异步委托主要用于解决 ThreadPool.QueueUserWorkItem 没有提供获取线程执行完成后的返回值问题,下面我们就来学习一下C#如何利用异步委托实现获取线程返回值吧
写在前面
异步委托主要用于解决 ThreadPool.QueueUserWorkItem 没有提供获取线程执行完成后的返回值问题。异步委托只能在.Net Framework 框架下使用,.Net Core中会报平台错误,而且使用Task.Result来获取返回值,可以达成同样的目的;本文纯粹是做个验证试验。
代码实现
static void Main(string[] args) { AsyncResultTest(); Console.WriteLine("OK"); Console.ReadKey(); } public static void AsyncResultTest() { var str = "hello"; var testOb = new TestOb() { msg = str }; Func<TestOb, int> testMethod = Dosomething; //testMethod.BeginInvoke(testOb, Done, testMethod); var asyncResult = testMethod.BeginInvoke(testOb, null, null); var task01 = Task.Factory.StartNew(() => { Thread.Sleep(1000); testOb.msg = "hello world"; Console.WriteLine($"task01 exceuted str is {testOb.msg}"); }); task01.Wait(); var result = testMethod.EndInvoke(asyncResult); Console.WriteLine($"AsyncResultTest finished, result is {result}"); } private static int Dosomething(TestOb testOb) { Console.WriteLine($"Dosomething:{testOb.msg}"); Thread.Sleep(2000); return testOb.msg.Length; } private static void Done(IAsyncResult result) { var asyncState = (Func<TestOb, int>)result.AsyncState; var retVal = asyncState.EndInvoke(result); Console.WriteLine($"result is:{retVal}"); } class TestOb { public string msg { get; set; } }
执行结果
.Net Core 下实现类似效果的代码:
public static void TaskReturnValueTest() { var value = "000"; var task01 = Task.Factory.StartNew(() => { value = "111"; Thread.Sleep(1000); Console.WriteLine($"task01 exceuted value is {value}."); return "1"; }); var task02 = Task.Factory.StartNew(() => { Thread.Sleep(800); value = "222"; Console.WriteLine($"task02 exceuted value is {value}."); return "2"; }); Task.WaitAll(task01, task02); var ret01 = task01.Result; var ret02 = task02.Result; Console.WriteLine($"task01: {ret01}, task02: {ret02}"); Console.WriteLine("Ok"); }
执行结果:
总结
用Task类库的代码实现方式明显更优,更易于理解和维护。
到此这篇关于C#利用异步委托实现获取线程返回值的文章就介绍到这了,更多相关C#获取线程返回值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
相关文章
C#多线程之Thread中Thread.Join()函数用法分析
这篇文章主要介绍了C#多线程之Thread中Thread.Join()函数用法,实例分析了Thread.Join()方法的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下2015-04-04WMI获取硬件信息封装函数方法(联想台式机出厂编号 CPUID BIOS序列号 硬盘信息 显卡信息 MAC地址)
这篇文章主要介绍了WMI获取硬件信息的方法,硬件信息有:联想台式机出厂编号 CPUID BIOS序列号 硬盘信息 显卡信息 MAC地址2013-11-11
最新评论