我发现自己经常这样编写代码:
try
{
cancellationTokenSource.Cancel();
await task.ConfigureAwait(false); // this is the task that was cancelled
}
catch(OperationCanceledException)
{
// Cancellation expected and requested
}
考虑到我请求取消,这是预料之中的,并且我真的希望忽略该异常。这似乎很普通。
有更简洁的方法吗?我是否错过了一些取消事宜?似乎应该有一个task.CancellationExpected()
方法或其他方法。
参考方案
我认为没有内置的功能,但是您可以在扩展方法中捕获逻辑(一个用于Task
,一个用于Task<T>
):
public static async Task IgnoreWhenCancelled(this Task task)
{
try
{
await task.ConfigureAwait(false);
}
catch (OperationCanceledException)
{
}
}
public static async Task<T> IgnoreWhenCancelled<T>(this Task<T> task)
{
try
{
return await task.ConfigureAwait(false);
}
catch (OperationCanceledException)
{
return default;
}
}
然后,您可以编写更简单的代码:
await task.IgnoreWhenCancelled();
要么
var result = await task.IgnoreWhenCancelled();
(根据您的同步需求,您可能仍想添加.ConfigureAwait(false)
。)
当我们调用异步方法时,我们返回一个包装器任务。public async Task ExecuteActionAsync() { // no await called } public async Task ExecuteActionAwaitAsync() { // await called on a completed await Task.Complet…
Task.IsCancelled不起作用 - c#我有以下示例代码:static class Program { static void Main() { var cts = new CancellationTokenSource(); var task = Task.Factory.StartNew( () => { try { Console.WriteLine("Task: Runni…
等待Task.CompletedTask是否意味着async方法将同步运行? - c#static async Task WaitTaskCompleted() { //Use Thread A before await Task.CompletedTask await Task.CompletedTask; //Will the code after await Task.CompletedTask always use Thread A,…
如何监视和重新启动在C#中引发异常的任务? - c#假设我有一个实例化无限期运行的三个任务的程序。这些任务旨在并行运行。但是,可以说这些任务由于网络错误有时会引发异常。监视任务并在必要时重新启动它最简单的技术是什么?解决此问题的我的工作是监视Task.Status数据,并在任务出现故障时简单地调用Task.Start()方法。但是,此代码不起作用,因为任务异常会导致整个应用程序崩溃。using System;…
多重处理:map与map_async - python使用map和map_async有什么区别?将列表中的项目分配给4个进程后,它们是否运行相同的功能?因此,假设两者都在异步和并行运行是错误的吗?def f(x): return 2*x p=Pool(4) l=[1,2,3,4] out1=p.map(f,l) #vs out2=p.map_async(f,l) python大神给出的解决方案 将作业映射到流程…