gpt4 book ai didi

c# - 如何将 task.Wait(CancellationToken) 转换为 await 语句?

转载 作者:可可西里 更新时间:2023-11-01 08:21:20 25 4
gpt4 key购买 nike

因此,task.Wait() 可以转化为await task。当然,语义是不同的,但这大致就是我将使用 Waits 的阻塞代码转换为使用 awaits 的异步代码的方式。

我的问题是如何将 task.Wait(CancellationToken) 转换为相应的 await 语句?

最佳答案

await 用于异步方法/委托(delegate),它们要么接受 CancellationToken,因此您应该在调用它时传递一个(即 await Task.Delay (1000, cancellationToken)),或者它们没有并且不能真正被取消(例如等待 I/O 结果)。

但是,您可以使用此扩展方法放弃*这些类型的任务:

public static Task<T> WithCancellation<T>(this Task<T> task, CancellationToken cancellationToken)
{
return task.IsCompleted // fast-path optimization
? task
: task.ContinueWith(
completedTask => completedTask.GetAwaiter().GetResult(),
cancellationToken,
TaskContinuationOptions.ExecuteSynchronously,
TaskScheduler.Default);
}

用法:

await task.WithCancellation(cancellationToken);

* 放弃的任务不会被取消,但您的代码的行为就像它已经取消一样。它要么以结果/异常结束,要么将永远存在。

关于c# - 如何将 task.Wait(CancellationToken) 转换为 await 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25632803/

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