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();
}

我想杀死主线程。

4

3 回答 3

9

一般建议:不要杀死线程(参见例如杀死线程)。涉及各种令人讨厌的资源泄漏和数据损坏风险。

相反,使线程表现良好,并通过您喜欢的任何 IPC 机制,让它们在收到信号时完成工作。

我不记得 .NET API 识别父线程和子线程。这将使您有责任跟踪这种关系。

于 2010-04-29T13:10:22.550 回答
2

您绝对不想在这里杀死任何线程,因为(除其他原因外)有问题的“子线程”都来自线程池。

请参阅这篇文章,了解如何创建和终止线程。

在您的情况下,您有多个线程都在使用该startParsing方法。假设此方法中有一个循环,您将创建一个类级别的bool调用_stillWorking或其他东西,并将其设置为方法true的开头startWorking

在循环中,您每次都startParsing检查它_stillWorkingtrue然后,要“取消”所有这些线程,您只需设置_stillWorkingfalse等待线程完成。

于 2010-04-29T13:43:31.600 回答
2

您可能会考虑将退出子线程的请求传回给父线程,然后在那里处理它。我想你会发现它整体上要简单得多。

于 2010-04-29T13:47:32.063 回答