简便的方法来等待已取消的任务? - c#

我发现自己经常这样编写代码:

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)。)

等待异步方法中已完成的任务 - c#

当我们调用异步方法时,我们返回一个包装器任务。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大神给出的解决方案 将作业映射到流程…