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类库的代码实现方式明显更优,更易于理解和维护。

相关推荐

  1. C++同异步极致线

    2023-12-13 02:18:03       42 阅读
  2. C# 异步线的区别

    2023-12-13 02:18:03       16 阅读
  3. 使用ajax异步获取下拉列表的

    2023-12-13 02:18:03       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-13 02:18:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-13 02:18:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-13 02:18:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-13 02:18:03       20 阅读

热门阅读

  1. 理解Go中的指针

    2023-12-13 02:18:03       40 阅读
  2. Go (一) 基础部分4 -- 文件处理

    2023-12-13 02:18:03       29 阅读
  3. 【PID学习笔记 8 】控制系统的分析方法之一

    2023-12-13 02:18:03       25 阅读
  4. VUE ui工程创建

    2023-12-13 02:18:03       40 阅读
  5. 常见加密算法解密脚本

    2023-12-13 02:18:03       47 阅读
  6. 前端知识笔记(三十六)———HTTP 缓存机制

    2023-12-13 02:18:03       31 阅读
  7. 【代码随想录】算法训练计划49

    2023-12-13 02:18:03       40 阅读
  8. MySQL中查询当天数据中离时间点最近的数据

    2023-12-13 02:18:03       43 阅读
  9. Python卡尔曼滤波器OpenCV跟踪和预测物体的轨迹

    2023-12-13 02:18:03       44 阅读
  10. 3D点云:平面模型上提取凸(凹)多边形方法

    2023-12-13 02:18:03       30 阅读