关注this question,我正在尝试使用TPL实现异步方法,并尝试遵循TAP指南。
我希望我的异步方法在完成后执行回调。据我所知,有三种方法可以做到这一点。
1)在我的任务代表中手动回调
public Task DoWorkAsync(DoWorkCompletedCallback completedCallback)
{
return Task.Factory.StartNew(
{
//do work
//call callback manually
completedCallback();
});
}
2)在任务委托中为任务分配回调
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更正确,因为它将回调与方法分离,并且意味着客户端代码可以以任何方式管理任务(使用回调,轮询等),这似乎是什么任务都是关于。但是,如果DoWorkAsync()在客户端代码挂钩其回调之前完成其工作会发生什么?
是否有一种普遍接受的方法可以做到这一点,还是全新的?
2)超过1)是否有任何优势?
答案 0 :(得分:32)
普遍接受的方式是3。
TPL的用户通常知道他们可以使用ContinueWith继续任务。 1和2提供相同的功能,但具有非标准接口;用户必须弄清楚委托参数的含义以及传递的内容,例如如果他们不想继续 - 所有这一切仍然会返回一个可以标准方式继续的任务。