0

我需要知道如何在發生異常時在pararell foreach循環中停止任務?如果Foo1()拋出異常DoSomeWork()應該被取消。如何在發生異常時在pararell foreach循環中停止任務?

Item類

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財產?

+1

只是不要捕捉異常,或者如果你想記錄日誌的目的,然後再拋出 –

+0

你是否想要取消循環的所有其他迭代? – svick

+0

@svick不,只有拋出異常的任務。 –

回答

0

下面是從MSDN一個很好的例子:https://msdn.microsoft.com/de-de/library/ee256691(v=vs.110).aspx

環路啓動前:

CancellationTokenSource cts = new CancellationTokenSource(); 
ParallelOptions po = new ParallelOptions(); 
po.CancellationToken = cts.Token; 

在循環中:

Parallel.ForEach(nums, po, (num) => 
       { 
        // Do some work here 
        po.CancellationToken.ThrowIfCancellationRequested(); 
       }); 

從另一個線程,你可以觸發取消事件:

cts.Cancel(); 
相關問題