4

親にはいくつかの子スレッドがあります。

ユーザーが停止ボタンをクリックした場合、親スレッドはすべての子スレッドで強制終了されます。

//calls a main thread           
 mainThread = new Thread(new ThreadStart(startWorking));
 mainThread.Start(); 
////////////////////////////////////////////////
   startWorking()
{
    ManualResetEventInstance                    =   new ManualResetEvent(false);
    ThreadPool.SetMaxThreads(m_ThreadPoolLimit, m_ThreadPoolLimit);

    for(int i = 0; i < list.count ; i++)
   {        

        ThreadData obj_ThreadData   =   new ThreadData();
        obj_ThreadData.name      =   list[i];

        m_ThreadCount++;             

        //execute 
        WaitCallback obj_waitCallBack = new WaitCallback(startParsing);

        ThreadPool.QueueUserWorkItem(obj_waitCallBack, obj_ThreadData);
    }
  ManualResetEventInstance.WaitOne();
}

mainThreadを強制終了したい。

4

3 に答える 3

9

一般的なアドバイス: スレッドを kill しないでください (例: Killing a threadを参照)。あらゆる種類の厄介なリソース リークとデータ破損のリスクが関係しています。

代わりに、スレッドを適切に動作させ、代わりに、任意の IPC メカニズムを介して、シグナルが送信されたときに作業を終了させます。

.NET API が親スレッドと子スレッドを認識していたことを思い出せません。それは関係を追跡するあなたの責任になります.

于 2010-04-29T13:10:22.550 に答える
2

問題の「子スレッド」はすべてスレッドプールからのものであるため、ここでスレッドを強制終了したくないことは間違いありません。

スレッドを作成および終了する方法 については、この記事を参照してください。

あなたの場合、複数のスレッドがすべてstartParsingメソッドを実行しています。このメソッドにループがあると仮定すると、or というbool名前のクラス レベルを作成し、メソッドの先頭で に設定します。_stillWorkingtruestartWorking

のループ内で、毎回通過することをstartParsing確認します。これらすべてのスレッドを「キャンセル」するには、 に設定して、スレッドが終了するのを待ちます。_stillWorkingtrue_stillWorkingfalse

于 2010-04-29T13:43:31.600 に答える
2

子スレッドからの終了要求を親スレッドに伝えてから、そこで処理することを検討してください。全体的にシンプルになったと思います。

于 2010-04-29T13:47:32.063 に答える