我正在设计一个执行长时间运行任务的类。我想到的第一个设计是:
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/