如果我想公开一个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);
}
最常用的处理方式是什么?
答案 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方法。