如果取消了完成源,在结果变量中我会收到什么?
async void SomeMethod()
{
.....
Run();
var result = await GetResult();
.....
}
Task<SomeResult> GetResult()
{
return myCompletionSource.Task;
}
TaskCompletionSource myCompletionSource;
void Run()
{
myCompletionSource= new TaskCompletionSource();
TriggerSomeLongLastingLogicWhichWillCallCallBackBelow();
}
void SomeCallback()
{
if (someCondition)
{
myCompletionSource.SetResult(<someResult>);
}
else
{
myCompletionSource.SetCancelled();
}
}我不太确定这种方法是否正确。
发布于 2015-04-22 07:01:21
如果取消了完成源,在结果变量中我会收到什么?
在等待取消的任务时,代码将抛出一个OperationCancelledException。因此,结果变量将永远不会被设置。
您可以使用try/catch块处理异常:
async Task SomeMethod()
{
try
{
.....
Run();
var result = await GetResult();
}
catch(OperationCancelledException)
{
// handle cancelled operation
}
}此外,SomeMethod应该返回一个Task,因为void返回的async方法通常只适用于事件处理程序,因为它们必须返回void。我在博客上对此做了简要的介绍,这里。
通常,如果您希望一个操作是可取消的,则需要传入一个CancellationToken,该操作必须检查该操作并将其传递给它启动的其他操作。所以你一直把它传递给你的回收站。
您还可以向CancellationToken注册一个回调,当令牌被取消时,该回调会取消TaskCompletionSource,因此不需要在您的方法中这样做。
void Run()
{
var cts = new CancellationTokenSource();
var myCompletionSource= new TaskCompletionSource();
cts.Token.Register(() => myCompletionSource.SetCancelled());
TriggerSomeLongLastingLogicWhichWillCallCallBackBelow(cts.Token);
}
void SomeCallback(CancellationToken token)
{
// do some work
....
token.ThrowIfCancellationRequested();
if (someCondition)
{
myCompletionSource.SetResult(<someResult>);
}
else
{
myCompletionSource.SetException(new Exception("error occcured"));
}
}https://stackoverflow.com/questions/29788823
复制相似问题