当前位置: 首页>行业 >

世界看热讯:C#异步有多少种实现方式?

来源: 博客园 | 时间: 2023-05-09 06:43:56 |

前言

微信群里的一个提问引发的这个问题,C#异步有多少种实现方式?首先想要知道C#异步有多少中实现方式,首先我们要知道.NET提供的执行异步操作的三种模式,然后再去了解C#异步实现的方式。


(资料图片)

.NET异步编程模式

.NET 提供了执行异步操作的三种模式:

基于任务的异步模式 (TAP),该模式使用单一方法表示异步操作的开始和完成。 TAP 是在 .NET Framework 4 中引入的。这是在 .NET 中进行异步编程的推荐方法。C# 中的async和await关键词以及 Visual Basic 中的Async和Await运算符为 TAP 添加了语言支持。 有关详细信息,请参阅基于任务的异步模式 (TAP)。

基于事件的异步模式 (EAP),是提供异步行为的基于事件的旧模型。 这种模式需要后缀为Async的方法,以及一个或多个事件、事件处理程序委托类型和EventArg派生类型。 EAP 是在 .NET Framework 2.0 中引入的。 建议新开发中不再使用这种模式。 有关详细信息,请参阅基于事件的异步模式 (EAP)。

异步编程模型 (APM) 模式(也称为IAsyncResult模式),这是使用IAsyncResult接口提供异步行为的旧模型。 在这种模式下,同步操作需要BeginEnd方法(例如,BeginWriteEndWrite以实现异步写入操作)。 不建议新的开发使用此模式。 有关详细信息,请参阅异步编程模型 (APM)。

C#异步有四种实现方式

C# 异步有多种实现方式,可归纳为以下几类:

1、异步方法(Async Method TAP模式

使用async/await关键字实现异步编程,这是比较常用的一种异步实现方式。例如:

public async Task TestDoSomeAsync()    {        await Task.Delay(1000);        Console.WriteLine("Async method completed.");    }
2、任务并行库(TPL, Task Parallel Library TAP模式

通过 Task 和 Task 类型实现异步编程,可以利用多核处理器,并发执行多个独立的任务。例如:

public static async void Main(string[] args)    {        await Task.Run(() =>        {            Console.WriteLine("Test Task 1 completed.");        });        await Task.Run(() =>        {            Console.WriteLine("Test Task 2 completed.");        });        // 等待所有任务完成        Task.WaitAll();    }
3、Asynchronous Programming Model(APM模式)

是一种经典的异步编程模式,需要手动创建回调函数,用于处理完成或错误的通知。可以通过 IAsyncResult 设计模式的 Begin 和 End 方法来实现,其中 Begin 方法开始异步操作,而 End 方法在异步操作完成时执行,并返回异步操作的结果。

需要注意的是,APM 模式通过 IAsyncResult 接口来存储异步操作的状态和结果,相对比较复杂,代码量也较大。同时,在使用 APM 模式时,还需要手动处理回调函数和等待异步操作完成等细节工作,使得开发起来相对较为繁琐。

class Program    {        static void Main(string[] args)        {            // 创建异步操作类实例            MyAsyncClass asyncClass = new MyAsyncClass();            // 开始异步操作            IAsyncResult result = asyncClass.BeginDoWork(null, null);            // 主线程执行其他操作            // 等待异步操作完成并获取结果            int res = asyncClass.EndDoWork(result);            // 处理异步操作的结果            Console.WriteLine("Result: " + res);            Console.ReadLine();        }    }    class MyAsyncClass    {        ///         /// 异步执行的方法        ///         /// callback        /// state        ///         public IAsyncResult BeginDoWork(AsyncCallback callback, object state)        {            // 创建一个新的异步操作对象            MyAsyncResult result = new MyAsyncResult(state);            // 开始异步操作            Thread thread = new Thread(() =>            {                try                {                    // 执行一些操作                    int res = 1 + 2;                    // 设置异步操作的结果                    result.Result = res;                    // 触发回调函数                    callback?.Invoke(result);                }                catch (Exception ex)                {                    // 设置异步操作的异常                    result.Error = ex;                    // 触发回调函数                    callback?.Invoke(result);                }            });            thread.Start();            // 返回异步操作对象            return result;        }        ///         /// 结束异步执行的方法        ///         /// result        ///         public int EndDoWork(IAsyncResult result)        {            // 将 IAsyncResult 转换为 MyAsyncResult 类型,并等待异步操作完成            MyAsyncResult myResult = (MyAsyncResult)result;            myResult.AsyncWaitHandle.WaitOne();            // 在异步操作中抛出异常            if (myResult.Error != null)            {                throw myResult.Error;            }            // 返回异步操作的结果            return myResult.Result;        }    }    class MyAsyncResult : IAsyncResult    {        public bool IsCompleted => AsyncWaitHandle.WaitOne(0);        public WaitHandle AsyncWaitHandle { get; } = new ManualResetEvent(false);        public object AsyncState { get; }        public bool CompletedSynchronously => false;        public int Result { get; set; }        ///         /// 存储异步操作的结果或异常信息        ///         public Exception Error { get; set; }        ///         /// 构造函数        ///         /// asyncState        public MyAsyncResult(object asyncState)        {            AsyncState = asyncState;        }    }
4、Event-based Asynchronous Pattern(EAP模式)

一种已过时的异步编程模式,需要使用事件来实现异步编程。例如:

需要注意的是,EAP 模式通过事件来实现异步编程,相对于 APM 模式更加简洁易懂,同时也避免了手动处理回调函数等细节工作。但是,EAP 模式并不支持 async/await 异步关键字,因此在一些特定的场景下可能不够灵活。

public class MyAsyncClass : Component    {        ///         /// 声明一个委托类型,用于定义异步操作的方法签名        ///         ///         ///         public delegate int MyAsyncDelegate(int arg);        ///         /// 声明一个事件,用于通知异步操作的完成        ///         public event MyAsyncDelegate OperationNameCompleted;        ///         /// 异步执行方法,接受一个参数 arg        ///         ///         public void DoWorkAsync(int arg)        {            // 将异步操作放入线程池中执行            ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), arg);        }        ///         /// 真正的异步操作        ///         ///         private void DoWork(object obj)        {            int arg = (int)obj;            int res = arg + 1;            // 触发事件,传递异步操作的结果            OperationNameCompleted?.Invoke(res);        }    }
参考文章

https://learn.microsoft.com/zh-cn/dotnet/standard/asynchronous-programming-patterns/

关键词:

 

热文推荐

世界看热讯:C#异步有多少种实现方式?

前言微信群里的一个提问引发的这个问题,C 异步有多少种实现方式?首先想要知道C 异步有多少中实现方式,首

2023-05-09

环球观热点:新能源汽车技术和安全存在四方面问题

对此,中消协指出,动力电池是新能源汽车的核心部件,新能源汽车企业应当加强动力电池的研发和创新,保障驾

2023-05-09

季店乡马店村志愿服务队-最新消息

1、季店乡马店村志愿服务队是由孝昌县志愿者联合会领导下的志愿团体。2、成立于2018年1月1日。文章到此就分

2023-05-09

阿姨爷叔请提问|群聊太多?“折叠”一下!|世界微速讯

01:09阿姨爷叔的微信上,估计都有很多群聊,家庭群、老同事群、老同学群、广场舞群、买菜群等等等等。有的

2023-05-09

普拉蒂尼:足坛不再有我这种角色,马拉多纳和梅西是九号半 看点

直播吧5月8日讯前欧足联主席普拉蒂尼近日接受意大利《新闻报》采访,他认为足坛已经没有像他那样的十号球员

2023-05-08

每日讯息!中超2大亚冠“生死战”出炉,倒数第1首秀,海港PK泰超,输球淘汰

中超已经5轮过后,联赛格局变化较为明显,2022赛季的三甲球队相继凋零,成绩最好的是卫冕冠军武汉三镇,不

2023-05-08

天天讯息:嘉兴燃气(09908.HK)拟3360万元收购盐城星洲佳源房地产开发10%股权

格隆汇5月8日丨嘉兴燃气(09908 HK)宣布,于2023年5月8日,公司直接全资附属公司嘉兴市嘉燃建设拟向卖方新加

2023-05-08

美通筑机财务负责人洪文彬辞职 陈国雄接任 2022年公司亏损29.68万

美通筑机财务负责人洪文彬辞职陈国雄接任2022年公司亏损29 68万2023 5 819:58:53挖贝网春雨挖贝网5月8日,

2023-05-08

金茂联合体总价13.6亿摘得青岛世博园两宗相邻宅地|天天热闻

5月6日,青岛李沧区世博园2宗商住地成功出让,总占地面积约6 14万㎡,总建面约11 22万㎡,均由青岛方盛置业

2023-05-08

外教性骚扰女教师和女学生?学校:已开除! 焦点报道

近日,网传江西南昌天行创世纪学校外籍教师“性骚扰”该校女教师及女学生,疑似相关聊天记录曝光,引发网友

2023-05-08

北欧联合银行:欧元兑美元或在年底温和走高

未来几年全球经济衰退的可能性极大,是美元走势的不确定因素,但衰退可能对美元有利

2023-05-08

成都大熊猫繁育研究基地:一男子向大熊猫泼矿泉水,禁止其终身参观

请各位游客朋友们做一个文明参观者不投喂、不抛物、不泼水不高声喧哗,不大声喊叫大熊猫名字更不能播放饲养

2023-05-08

2023年全国大中城市巡回招聘“北京站”启动

2023年全国大中城市巡回招聘“北京站”启动---职引未来—2023年全国大中城市巡回招聘“北京站”活动日前在

2023-05-08

隆鑫诺亚方舟价格怎样了,海南房子能不能升值 全球今日讯

隆鑫诺亚方舟价格怎样了,海南房子能不能升值海南乐东房价为啥还在涨?隆鑫诺亚方舟房子还能不能买?隆鑫诺

2023-05-08

环球观热点:中金:维持网易-S(09999)“跑赢行业”评级 目标价175港元

中金预计网易-S(09999)1Q23收入同比增长8%至253亿元。

2023-05-08

最新:4月末我国外汇储备规模为32048亿美元

本报记者袁新建日前,记者从国家外汇管理局官方网站获悉,截至4月末,截至2023年4月末,我国外汇储备规模为

2023-05-08

车子撞人了保险公司怎么理赔?赔哪些费用?

首先,需要明确的是,如果车辆撞上行人,肇事者必须承担相应的责任,并向被撞者进行赔偿。这时候,保险公司

2023-05-08

危险!美国家经济已经空了,若不进行有效拯救,将连累世界经济 当前信息

危险!美国家经济已经空了,若不进行有效拯救,将连累世界经济,国债,美国家经济,美国银行业危机

2023-05-08

每日速讯:员工擅自离职如何赔偿

一、员工擅自离职如何赔偿员工擅自离职的赔偿方式是:1 如果劳动者是普通员工且处于试用期内擅自离职,用人

2023-05-08

焦点!碳酸饮料有哪些 碳酸饮料有哪些股票

1、碳酸饮料有可口可乐,百事可乐,雪碧,七喜,美年达,芬达,健力宝,屈臣氏watsonswater,Schweppes怡泉

2023-05-08

资讯

因地制宜放“大招” 多地市密集出台稳经济措施

当前,受新冠肺炎疫情等因素影响,我国经济发展仍面临严峻挑战。5月25日,国务院召开全国稳住经济大盘会议,要求把稳增长放在更突出位置。5

2022-06-20     
北京推出14条秋游文化线路

金秋时节,北京市文化和旅游局以赏银杏品文化为主题,推出14条“叶落的季节——漫步北京赏银杏品文化主题线路”,邀市民和游客以步行、骑行

2021-10-27     
基因编辑发力 培育高质量人源化供体猪

此次人体试验,仅仅验证了基因编辑猪克服异种器官移植的超急性排斥反应,还需解决延迟性排斥反应、消耗性血栓等问题。但通过这次试验,能更

2021-10-27     
中国经济高质量发展步伐稳健 长期向好基本面未变

在全球疫情走势和经济走势趋于复杂的背景下,中国经济巨轮将驶向何方,举世关注。2020年10月26日至29日,党的十九届五中全会在京举行,明确

2021-10-27     
南美解放者杯决赛允许近4.5万观众入场

南美洲足联主席多明格斯25日与今年解放者杯决赛对阵的两支俱乐部负责人会晤,宣布决赛现场观众人数增加到球场容量的75%,即近4 5万人。今年

2021-10-27     
22年从警生涯 面对荣誉他说不要给我报功

9月24日,时任安徽省安庆市公安局迎江分局刑警大队大要案中队中队长周磊因在工作中激烈搏斗引发心源性猝死,倒在了工作岗位上,经医院抢救

2021-10-27