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

时间:2011-11-23 15:07:42

标签: c# asynchronous callback task-parallel-library

关注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)是否有任何优势?

1 个答案:

答案 0 :(得分:32)

普遍接受的方式是3。

TPL的用户通常知道他们可以使用ContinueWith继续任务。 1和2提供相同的功能,但具有非标准接口;用户必须弄清楚委托参数的含义以及传递的内容,例如如果他们不想继续 - 所有这一切仍然会返回一个可以标准方式继续的任务。