【问题标题】:Advantages of using standard .Net Async patterns?使用标准 .Net Async 模式的优势?
【发布时间】:2011-11-23 10:05:48
【问题描述】:

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

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 要求客户端代码始终调用 EndDoSomething(),即使在它们的 completedCallback 中也是如此,而 EAP 需要单独订阅已完成的事件。

使用我缺少的标准模式有哪些优势(如果有的话)?

【问题讨论】:

    标签: c# design-patterns asynchronous


    【解决方案1】:

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

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

    所以,把新的方式加入进来:

    public Task DoSomethingAsync(string param);
    

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

    【讨论】:

    • +1 表示基于任务。 MS 正在接受这种方法,而不是以前的异步模式。如果使用这种方法,代码将在一段时间内面向未来。
    • 是的,我读过这方面的内容并且对它非常满意,直到我意识到这都是预览版的东西。在它被正确发布之前不太舒服。
    • @GazTheDestroyer 目前存在基于任务的方法,查看任务并行库
    • 太棒了,谢谢。我一直在阅读有关 await 关键字的信息,因此假设任务异步模式也是类似的预览。对于其他人来说,这里有一个很好的概述:microsoft.com/download/en/confirmation.aspx?id=19957
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2016-10-24
    • 2017-11-24
    • 2011-07-24
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多