c# - 使用标准 .Net 异步模式的优势?

标签 c# design-patterns asynchronous

我正在设计一个执行长时间运行任务的类。我想到的第一个设计是:

public TaskHandle DoSomethingAsync(DoSomethingCompleteCallback completedCallback);
public void       CancelDoSomething(TaskHandle handle);

这简单明了。但是,我想知道我是否应该将它实现为我一直在阅读的标准 .Net 异步模式之一?

APM:

public IAsyncResult BeginDoSomething(AsyncCallback completedCallback, Object stateObject);
public void         EndDoSomething(IAsyncResult asyncResult);

EAP:

public void  DoSomethingAsync(string param, object userState);
public event DoSomethingCompletedEventHandler DoSomethingCompleted;

IMO 这些似乎使界面复杂化,除了让其他 .Net 开发人员可以识别模式外,并没有真正的优势。 APM 要求客户端代码即使在其 completedCallback 中也始终调用 EndDoSomething(),而 EAP 要求单独订阅已完成的事件。

使用我所缺少的标准模式有什么优势(如果有的话)?

最佳答案

这些模式的唯一优点是它们可以立即被其他开发人员识别并且可能具有框架支持(例如 WCF 中的开始结束支持)。

然而,随着 TPL 和 .Net4 的引入以及在新的 .Net4.5 版本中的进一步集成,.Net 似乎正在远离 IAsyncResult/Begin End 范式,更多地转向基于任务的异步(恕我直言,更可取)。

因此,将新方法融入其中:

public Task DoSomethingAsync(string param);

然后所有与取消/访问结果相关的操作都在 Task 对象上可用,这允许对异步机制进行适当的抽象,因为任何消费者只依赖于 Task 而不是工作的“发起者”和处理被退回。

关于c# - 使用标准 .Net 异步模式的优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240316/

相关文章:

c# - 从另一个 ViewModel Xamarin.Forms 更新 ViewModel

c# - 如何从2个List<Point>中获取最近的2个点

oop - 域对象和值对象-它们相等吗?

android - 获取资源值时没有包标识符

JavaScript 回调和控制流

c# - Wpf 的 RichTextBox 替代方案

c# - 为什么这个条件返回真?

design-patterns - 存储库模式中的数据库调用在哪里?

c# - 在运行时将类型传递给 FirstOrDefault

javascript - 我是否需要在异步函数中的每个语句之前放置await?