如果并行任务抛出异常则取消任务
Canceling task if a parallel task throw an exception
我有两个共享相同取消标记的并行任务,客户端要求两个结果列表,例如:
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;
如果任务返回一个空列表,取消工作正常。
我的问题是:如果另一个任务抛出一般异常,如何取消其中一个任务?
通过@noobed 评论解决。
try
{
//fetch Entity1 results into entity1List
}
catch
{
cts.Cancel();
}
一般异常会被catch,cts可以cancel调用
我有两个共享相同取消标记的并行任务,客户端要求两个结果列表,例如:
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;
如果任务返回一个空列表,取消工作正常。
我的问题是:如果另一个任务抛出一般异常,如何取消其中一个任务?
通过@noobed 评论解决。
try
{
//fetch Entity1 results into entity1List
}
catch
{
cts.Cancel();
}
一般异常会被catch,cts可以cancel调用