3
假設有5個線程,T1,T2,T3,T4和T5以及5個線程當前正在運行。我的要求是停止所有4個線程,以防5個線程中的任何一個有任何異常。這怎麼能實現。我正在使用c#4.0如何發信號線程在任何一個c#中停止有例外
假設有5個線程,T1,T2,T3,T4和T5以及5個線程當前正在運行。我的要求是停止所有4個線程,以防5個線程中的任何一個有任何異常。這怎麼能實現。我正在使用c#4.0如何發信號線程在任何一個c#中停止有例外
這可以通過使用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方法。結果會有所不同 - 任務不會「完成」,它將處於「已取消」狀態。添加任務延續時,您需要考慮這一點。
你可以把一些代碼在這裏? –
創建一個布爾標誌,是對所有線程(類變量)..訪問,如果有一個例外組flag..All其他線程的檢查標誌將相應停止 – Anirudha
也有看看[取消模型](http://msdn.microsoft.com/en-us/library/dd997364.aspx) – Anirudha