【发布时间】:2017-05-25 08:35:14
【问题描述】:
我需要知道当异常发生时如何在pararell foreach 循环中停止任务?如果 Foo1() 抛出异常 DoSomeWork() 应该被取消。
物品类别
class Item
{
public async Task DoSomeWork()
{
try
{
await Foo1();
await Foo2();
}
catch (Exception ex)
{
Console.Writeline(ex.Message);
}
}
private async Task Foo1()
{
try
{
//
// some functionality
//
}
catch(Exception ex)
{
// If exception occurs, then how cancel Task DoSomeWork()
}
}
private async Task Foo2()
{
try
{
//
// some functionality
//
}
catch(Exception ex)
{
// If exception occurs, then how cancel Task DoSomeWork()
}
}
}
以及带有 Pararell.Foreach 循环的 ItemCollection 类
class ItemCollection
{
public void StartAsync()
{
try
{
IList<Task> il = new List<Task>();
Parallel.ForEach(ListOfItems, t => il.Add(t.DoSomeWork()));
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
在本例中如何使用 CancellationToken 属性?
【问题讨论】:
-
只是不要捕获异常,或者如果你想记录日志,之后再抛出它
-
是否也要取消循环的所有其他迭代?
-
@svick 不,只有抛出异常的任务。
标签: c# task parallel.foreach cancellation cancellationtokensource