代码之家  ›  专栏  ›  技术社区  ›  Shahar Shokrani

如果并行任务引发异常,则取消任务

  •  2
  • Shahar Shokrani  · 技术社区  · 7 年前

    我有两个共享相同取消令牌的并行任务,客户机请求两个结果列表,例如:

    class ResponseDTO
    {
        public IEnumerable<Entity1> Entity1List { get; set; }
        public IEnumerable<Entity2> Entity2List { get; set; }
    }
    

    这两个请求是同时计算并依赖的,因此如果列表中的一个没有结果,就不需要等待另一个结果。

    var cts = new CancellationTokenSource();
    var token = cts.Token;
    
    Task task1 = new Task(() =>
    {
        //fetch Entity1 results into entity1List
    
        if (!entity1List.Any())
        {
            cts.Cancel();
        }
        else
        {
            responseDTO.Entity1List = entity1List;
        }
    }, token);
    
    Task task2 = new Task(() =>
    {
        //fetch Entity2 results into entity2List
    
        if (!entity2List.Any())
        {
            cts.Cancel();
        }
        else
        {
            responseDTO.Entity2List = entity2List;
        }
    }, token);
    
    task1.Start();
    task2.Start();
    
    try
    {
        Task.WaitAll(new[] { task1, task2 }, token);
    }
    catch (OperationCanceledException oce)
    {
        return responseDTO;
    }
    catch (AggregateException ae)
    {
        foreach (var ex in ae.InnerExceptions)
            //Log the exception
        return responseDTO;
    }
    
    return responseDTO;
    

    如果任务返回了一个空列表,则取消操作正常。

    我的问题 是:如果另一个任务抛出一般异常,如何取消其中一个任务?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Shahar Shokrani    7 年前

    用@noobed注释解决。

    try
    {
        //fetch Entity1 results into entity1List
    }
    catch
    {
        cts.Cancel();
    }
    

    在一般异常情况下,它将被捕获,并且可以用cancel调用CTS。