在哪里定义基于任务的asynchronous方法的callback

在这个问题之后 ,我尝试使用TPL实现asynchronous方法,并尝试遵循TAP准则。

我希望我的asynchronous方法在完成时执行callback。 据我所知,有三种方法可以做到这一点。

1)在我的任务委托中手动callback

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) { return Task.Factory.StartNew( { //do work //call callback manually completedCallback(); }); } 

2)在任务委托中为任务分配callback

 public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) { return Task.Factory.StartNew( { //do work } ).ContinueWith(completedCallback); //assign callback to Task } 

3)将呼叫分配给主叫方的任务

 public Task DoWorkAsync() { return Task.Factory.StartNew( { //do work }); } public void SomeClientCode() { Task doingWork = DoWorkAsync(); doingWork.ContinueWith(OnWorkCompleted); } 

我的直觉是3更正确,因为它将方法的callback解耦,并且意味着客户端代码可以以任何它认为合适的方式(使用callback,轮询等)来pipe理任务,这似乎是任务所关心的。 但是,如果DoWorkAsync()在客户端代码挂钩callback之前完成其工作,会发生什么?

有一个普遍接受的方式来做到这一点,或者是太新了吗?

2)超过1)有什么优势吗?

普遍接受的方式是3。

TPL的用户通常知道他们可以继续执行任务。 1和2提供相同的function,但具有非标准的接口; 用户必须弄清楚委托参数意味着什么,例如,如果他们不想继续 – 通过这个方法仍然返回一个可以以标准方式继续的任务。