在哪里为基于任务的异步方法定义回调
本文关键字:异步方法 定义 回调 任务 于任务 在哪里 | 更新日期: 2023-09-27 18:15:36
根据这个问题,我正在尝试使用TPL实现异步方法,并试图遵循TAP指南。
我希望我的async方法在完成时执行回调。在我看来,有三种方法可以做到这一点。
1)在我的任务委托中手动回调
public Task DoWorkAsync(DoWorkCompletedCallback completedCallback)
{
return Task.Factory.StartNew(
{
//do work
//call callback manually
completedCallback();
});
}
2)在task delegate中给task分配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更正确,因为它从方法中解耦回调,并且意味着客户端代码可以以任何它认为合适的方式管理任务(使用回调,轮询等),这似乎是任务的全部内容。但是,如果DoWorkAsync()在客户端代码连接回调之前完成其工作,会发生什么?
是否有一种被普遍接受的方法来做到这一点,或者它太新了?
做2)比做1)有什么优势吗?
普遍接受的方法是3.
TPL的用户通常知道他们可以使用ContinueWith继续一个任务。1和2提供相同的功能,但使用非标准接口;用户必须弄清楚委托参数的含义和传递的内容,例如,如果他们不想继续——所有这些,而方法仍然返回一个可以以标准方式继续的任务。