NET中异步开发的模型有多少
本文关键字:模型 多少 开发 异步 NET | 更新日期: 2023-09-27 18:24:34
我正在使用C#学习异步编程,通常使用BeginInvoke
,但我不太确定创建异步应用程序的其他方法。
我问了一个关于这个的问题,请参阅下面的链接了解更多详细信息:
如何从BeginInvoke返回T值?
在上述链接中,Gravell表示异步开发有四种模式
至少有4个,那么-常规回调(非APM、非EAP)也不少见
但Overflow说有三个:
NET 中有3种异步开发模型
-
APM-(
BeginXXX
/EndXXX
),当长时间运行的任务完成时,它会调用回EndXXX
方法中的代码 -
EAP-基于事件。在这个模型中,当长时间运行的任务完成时,会引发一个事件来通知您的代码。
-
TPL-.NET 4中的新增功能,这是基于任务的版本。它看起来最像客户端代码的同步编程,使用流畅的接口。它使用
ContinueWith
回调您的代码。
有人能帮我吗?
我在谷歌上搜索了很多,但实际上他们使用BeginInvoke
的次数最多。谢谢你的帮助。
Thread.Start
-残酷的
delegate.BeginInvoke/EndInvoke
-"旧"标准
ThreadPool.QueueUserWorkItem
-智能
TaskFactory.StartNew
-唯一正确的方法(根据Patterns of parallel programming
的书|我建议你先读它以消除歧义)
术语"异步开发"中有很多内容
首先,您可能希望在后台线程上执行代码。我最近更新了一篇博客文章,对比了在后台执行代码的几种常见方法。以下是列表,按从最理想到最不理想的顺序排列:
Task
(由async/await使用)Task
(由任务并行库使用)BackgroundWorker
Delegate.BeginInvoke
- CCD_ 16
Thread
另一方面,您可能希望表示异步操作(可能是也可能不是在后台线程上执行的实际代码)。在这种情况下,有几种方法,从最理想到最不理想依次为:
Task
(采用基于任务的异步模式(TAP)的风格)- CCD_ 19与
Begin*
/CCD_ - 使用基于事件的异步模式(EAP)编写的组件
(作为旁注,BackgroundWorker
是EAP,而Delegate.BeginInvoke
是APM)。
另一方面,您通常可以指异步编程,这可以被解释为反应式方法。在这种情况下,我只知道两种方法:
- 反应性扩展(Rx)
- 基于事件的异步模式(EAP)
然而,您可以证明任何事件驱动的程序在某种程度上都是被动的,因此仅处理UI事件是"异步编程"的一种(简单)形式
此外,这些只是常见的型号。任何平台或库都可以添加更多。下面是我脑海中浮现的一些:
Socket
类具有一种特殊形式的APM,可用于最小化内存分配。它的工作原理与APM非常相似,但不符合模式- WinRT运行时(在Windows8中提供)有自己的异步操作表示(
IAsyncOperation<TResult>
和IAsyncInfo
) - Windows Phone特别支持后台代理,即使您的应用程序当前未运行,也可以在后台运行代码
学习Mikant为异步开发描述的方法肯定会很有用。我只是想提醒您,C#5.0正在完全重新设计该语言处理异步的方式。这将是它的主要主题,同时引入两个新的关键字,async和await。您只需对长时间运行的任务调用wait,它就会启动任务并将控制权返回给调用方法。一旦任务完成,它就继续执行其余的代码。
这是一个优秀的视频的全部细节,它的使用和解释。它不仅描述了执行异步操作的旧方法,而且对新样式进行了全面的回顾。它使编写异步应用程序变得更加容易,并且使用自然流可读性更强。
这是C#异步行为的未来,非常值得学习。
http://channel9.msdn.com/events/PDC/PDC10/FT09/