在哪里为基于任务的异步方法定义回调

本文关键字:异步方法 定义 回调 任务 于任务 在哪里 | 更新日期: 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提供相同的功能,但使用非标准接口;用户必须弄清楚委托参数的含义和传递的内容,例如,如果他们不想继续——所有这些,而方法仍然返回一个可以以标准方式继续的任务。