2013-10-25 15 views
3

假設有5個線程,T1,T2,T3,T4和T5以及5個線程當前正在運行。我的要求是停止所有4個線程,以防5個線程中的任何一個有任何異常。這怎麼能實現。我正在使用c#4.0如何發信號線程在任何一個c#中停止有例外

+0

你可以把一些代碼在這裏? –

+0

創建一個布爾標誌,是對所有線程(類變量)..訪問,如果有一個例外組flag..All其他線程的檢查標誌將相應停止 – Anirudha

+1

也有看看[取消模型](http://msdn.microsoft.com/en-us/library/dd997364.aspx) – Anirudha

回答

5

這可以通過使用CancellationToken來實現。 CancellationTokenSource可以在您的線程之間共享。

下面是任務的例子,但你可以使用線程\線程池

 CancellationTokenSource cts = new CancellationTokenSource(); 

     Task.Factory.StartNew(() => 
      { 
       while (1 == 1) 
       { 
        Thread.Sleep(1000); 
        Console.WriteLine("Thread1 in progress..."); 
        if (cts.Token.IsCancellationRequested) 
        { 
         Console.WriteLine("Thread1 exiting..."); 
         break; 
        } 
       } 
      }, cts.Token); 

     Task.Factory.StartNew(() => 
      { 
       while (1 == 1) 
       { 
        Thread.Sleep(1000); 
        Console.WriteLine("Thread2 in progress..."); 
        if (cts.Token.IsCancellationRequested) 
        { 
         Console.WriteLine("Thread2 exiting..."); 
         break; 
        } 
       } 
      }, cts.Token); 

     Task.Factory.StartNew(() => 
     { 
      while (1 == 1) 
      { 
       Thread.Sleep(1000); 
       Console.WriteLine("Thread3 in progress..."); 
       if (cts.Token.IsCancellationRequested) 
       { 
        Console.WriteLine("Thread3 exiting..."); 
        break; 
       } 
      } 
     }, cts.Token); 

     Task.Factory.StartNew(() => 
     { 

      Thread.Sleep(5000); 
      try 
      { 
       Console.WriteLine("Thread5 in progress..."); 
       int y = 0; 
       int x = 1/y; 
      } 
      catch 
      { 
       Console.WriteLine("Thread5 requesting cancellation..."); 
       cts.Cancel(); 
      } 
     }, cts.Token); 

,並檢查this鏈接,有相當多的CalcellationTokenSource例子(包括共享CancellationCancellationTokenSources):

編輯: 我應該提到,在請求calcellation時,不要「打破」循環,而只需調用Token的ThrowIfCancellationRequested方法。結果會有所不同 - 任務不會「完成」,它將處於「已取消」狀態。添加任務延續時,您需要考慮這一點。

相關問題