如果在线程尚未完成时覆盖Thread对象会发生什么?

时间:2012-09-18 01:12:33

标签: c# .net multithreading

假设您有一个类,您可以在其中启动一些后台线程:此类可以使用Run()方法启动这些线程,并使用Stop()方法正确地停止它们。其中一些后台线程可能是手动创建的,其他线程可能由Timer管理,在调用上述Run()方法时会激活。{/ p>

public void Run()
{
    m_ShutdownRequested = false; // shutdown flag disabled

    m_WorkerThread = new Thread(Work) { IsBackground = true };
    m_WorkerThread.Start();
    // ...
}

public void Stop()
{
    lock (m_LockInput)
    {
        m_ShutdownRequested = true; // shutdown flag enabled
        Monitor.Pulse(m_LockInput);
    }
    m_WorkerThread.Join(m_ShutdownTimeout);
}

假设用户单击UI上的 Run 按钮时调用Run()方法。同样,当用户单击UI上的 Stop 按钮时,将调用Stop()方法。如何通过UI调用这些方法?它们应该是异步的吗?如果是,如何处理某些线程无法停止的可能性?

假设执行Stop()方法后,某些线程未停止。此时,如果用户再次单击运行按钮,该类的实例将有一些线程尚未停止。但是,启动Run()方法会覆盖先前的m_WorkerThread实例:如果在线程尚未完成时执行此覆盖会发生什么?

2 个答案:

答案 0 :(得分:3)

线程漫游,不受影响。另一方面,你只是失去了解决问题的方法。

答案 1 :(得分:2)

不会覆盖线程,只是创建变量的新实例并分配它。正在运行的线程将继续运行,但由于您不再具有对它的引用,因此您将无法返回它。线程退出后,GC可能会清理线程实例,或者可能没有。