T1、T2、T3、T4、T5 の 5 つのスレッドがあり、そのうちの 5 つが現在実行中であるとします。私の要件は、5 つのスレッドのいずれかに例外がある場合に備えて、4 つのスレッドすべてを停止することです。どうすればこれを達成できますか。私はc#4.0を使用しています
質問する
3236 次
1 に答える
7
これは、CancellationTokens を使用して実現できます。CancellationTokenSource はスレッド間で共有できます。
これは Tasks の例ですが、Threads\ThreadPool を使用できます
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);
かなりの数の CalcellationTokenSource の例 (共有の CancellationCancellationTokenSources を含む) があるこのリンクを確認してください。
EDIT:おそらく、計算が要求されたときにループを「中断」する代わりに、トークンのThrowIfCancellationRequestedメソッドを呼び出すことができることに言及する必要があります。ただし、結果は異なります。タスクは「完了まで実行」されず、「キャンセル」状態になります。タスクの継続を追加するときは、これを考慮する必要があります。
于 2013-10-25T08:53:21.630 に答える