gpt4 book ai didi

c# - TaskCompletionSource 用法

转载 作者:行者123 更新时间:2023-11-30 20:44:07 25 4
gpt4 key购买 nike

如果取消完成源,我会在结果变量中收到什么?

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();
}
}

我不太确定这种做法是否正确。

  1. 换句话说,依赖任务状态而不是为带有状态变量的“someresult”创建包装器是一种好的做法吗?
  2. 如何处理取消的任务?我不喜欢回调,也不喜欢使用 ContinueWith 的解决方案,我可以在其中分析任务状态。

最佳答案

What would I receive in result variable if completion source was cancelled?

您的代码在等待已取消的任务时将抛出 OperationCancelledException。因此永远不会设置结果变量。

您可以使用 try/catch block 处理异常:

async Task SomeMethod()
{
try
{
.....
Run();
var result = await GetResult();
}
catch(OperationCancelledException)
{
// handle cancelled operation
}
}

此外,SomeMethod 应该返回一个 Task,因为 void 返回 async 方法通常只适用于事件处理程序因为它们必须返回 void。我在博客上简要介绍了它 here .

一般来说,如果您希望某个操作可取消,您可以传入一个CancellationToken,该操作必须检查该操作并将其传递给它启动的其他操作。因此,您将它一直传递到链中并进入您的回调。

您还可以使用 CancellationToken 注册一个回调,在取消 token 时取消 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"));
}
}

关于c# - TaskCompletionSource 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29788823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com