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



假设你有一个类,你可以在其中启动一些后台线程:这个类可以有一个启动这些线程的Run()方法,以及一个正确停止它们的Stop()方法。其中一些后台线程可能是手动创建的,其他的可能由Timer管理,该在调用上述Run()方法时被激活。

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()方法。同样,当用户单击 UI 上的">停止">按钮时,将调用Stop()方法。应如何实现这些方法才能通过 UI 调用?它们都应该是异步的吗?如果是,如何处理某些线程无法停止的可能性?

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

线程在徘徊,不受影响。另一方面,你只是失去了任何解决它的方法。

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

相关内容

最新更新