公开可取消的Task API的正确方法

时间:2014-02-27 13:32:37

标签: c# task-parallel-library async-await

如果我想公开一个API,它在内部调度一系列应该由用户取消的任务。 e.g。

public ??? DoWork()
{
    Task t = new .... , myCancellationToken);
    return ???
}

为取消控制返回的正确对象是什么? 是CancellationTokenSource吗?

public CancellationTokenSource DoWork()
{
    CancellationTokenSource source = new ....
    Task t = new .... , source.Token);
    return source;
}

我应该退还任何东西吗? 我是否应该接受CancellationToken作为arg并让用户在需要时创建令牌源?

public void DoWork(CancellationToken token)
{
    Task t = new .... , token);
}

最常用的处理方式是什么?

2 个答案:

答案 0 :(得分:6)

  

我是否应该将CancellationToken作为arg接受并让用户在需要时创建令牌源?

此。但是你也应该返回一个Task,以便用户可以观察它何时完成等。当然,这也适用于async / await。

您可能还希望有重载:

public Task DoWork()
{
    return DoWork(CancellationToken.None);
}

public Task DoWork(CancellationToken cancellationToken)
{
    ...
}

有关此类事项的一般约定,请参阅Task-based Asynchronous Pattern

答案 1 :(得分:0)

异步方法应该返回Task。如果没有使用IAsync实现回调模式,您将需要用于同步目的的任务以及获取结果。如果使用async标记方法并使用await调用它,则结果将自动从任务中解包。 任务是TPL的关注点。如果您不需要显式创建新任务,请不要创建新任务,而是更喜欢静态Run方法。