2

Windowsサービスのループごとに複数のスレッドを開始しました。これらのスレッドの名前については言及していません。これらのスレッドを終了するにはどうすればよいですか。次のコードを使用してスレッドを作成します。

 new Thread(() =>
            {
                foreach (MyClass detail in MyclassList)
                {
                    DoWork(detail);
                }

            }).Start();

これらのスレッドを開始することで、詳細ごとにスケジュールタスクを作成します。スケジューリングが完了した後、このスレッドを破棄できますか?

4

2 に答える 2

9

スレッドを強制的に終了することは決して良い考えではありません。実際に行うべきことは、適切に設計された「続行する必要がある」チェックをループ内に配置することです。これは、外部で「いいえ」に設定できます。それを行う方法は、コンテキストにもう少し依存します...例:

        int shouldExit = 0;
        new Thread(() =>
        {
            foreach (MyClass detail in MyclassList)
            {
                if(Thread.VolatileRead(ref shouldExit) != 0) break;
                DoWork(detail);
            }
        }).Start();
        ...
        // to terminate loop:
        Thread.VolatileWrite(ref shouldExit, 1);

ただし、スレッドセーフな終了テストを整理する方法は無数にあります。少し注意が必要なのは、チェック対象にアクセスできるある種のコンテキストを保持することだけです。

于 2012-05-17T11:09:14.063 に答える
0

まず、Task新しいスレッドを直接作成する代わりに、クラスを使用します。次に、組み込みのTPLキャンセルメカニズムを使用します。これがどのようになるかです。

var cts = new CancellationTokenSource();
var token = cts.Token;

var task = Task.Factory.StartNew(
  () =>
  {
    foreach (MyClass detail in MyclassList)
    {
      ct.ThrowIfCancellationRequested();
      DoWork(detail);
    }
  }, cts.Token); 

// Do other stuff here.

cts.Cancel(); // Request cancellation.
于 2012-05-17T15:27:38.360 に答える