4

T1、T2、T3、T4、T5 の 5 つのスレッドがあり、そのうちの 5 つが現在実行中であるとします。私の要件は、5 つのスレッドのいずれかに例外がある場合に備えて、4 つのスレッドすべてを停止することです。どうすればこれを達成できますか。私はc#4.0を使用しています

4

1 に答える 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 に答える