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#中标准的IDispose模式代码详解

    C#中标准的IDispose模式代码详解

    在本篇文章中小编给大家分享的是关于C#中标准的IDispose模式的实例用法相关内容,有需要的朋友们测试下。
    2019-09-09
  • 基于C#实现文本读取的常用方式详解

    基于C#实现文本读取的常用方式详解

    本文详细介绍了在C#开发中使用七种不同的方式来读取文件,包括FileStream配合Read方法,逐字节读取,File类的ReadAllText,StreamReader逐行读取和一次性读取等,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-04-04
  • C#实现给定字符串生成MD5哈希的方法

    C#实现给定字符串生成MD5哈希的方法

    这篇文章主要介绍了C#实现给定字符串生成MD5哈希的方法,涉及C#操作字符串的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 如何利用C#正则表达式判断是否是有效的文件及文件夹路径

    如何利用C#正则表达式判断是否是有效的文件及文件夹路径

    项目中少不了读取或设置文件路径的功能,如何才能对输入的路径是否合法进行判断呢?下面这篇文章主要给大家介绍了关于C#利用正则表达式判断是否是有效的文件及文件夹路径的相关资料,需要的朋友可以参考下
    2022-04-04
  • c# 如何使用结构体实现共用体

    c# 如何使用结构体实现共用体

    这篇文章主要介绍了c# 如何使用结构体实现共用体,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • 10个被低估的C#性能优化技巧分享

    10个被低估的C#性能优化技巧分享

    这篇文章主要为大家详细介绍了10个被低估的C#性能优化技巧,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以参考一下
    2025-03-03
  • C# DateTime日期比较方法案例详解

    C# DateTime日期比较方法案例详解

    这篇文章主要介绍了C# DateTime日期比较方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)

    C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)

    这篇文章主要介绍了C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Unity UGUI的Dropdown下拉菜单组件使用详解

    Unity UGUI的Dropdown下拉菜单组件使用详解

    这篇文章主要为大家介绍了Unity UGUI的Dropdown下拉菜单组件使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C#/.net程序调用Python的教程分享

    C#/.net程序调用Python的教程分享

    C#的优势在于window下的开发,不仅功能强大而且开发周期短。而python则有众多的第三方库,可以避免自己造轮子,利用C#来做界面,而具体实现使用python来实现可以大大提高开发效率。本文介绍如何使用pythonnet来执行python脚本,希望对大家有所帮助
    2023-03-03

最新评论