【问题标题】:C# How to kill parent threadC#如何杀死父线程
【发布时间】:2011-02-13 19:30:44
【问题描述】:

一个父线程有多个子线程。

如果用户单击停止按钮,则父线程应与所有子线程一起被杀死。

//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。

【问题讨论】:

  • 你想做什么?比如,你生成线程是为了什么?

标签: c# multithreading parent kill


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    请参阅this article,了解如何创建和终止线程。

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

    startParsing 的循环中,您每次都检查_stillWorking 是否为true。要“取消”所有这些线程,只需将 _stillWorking 设置为 false 并等待线程完成即可。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-11-11
        • 2011-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多