3

假设您有一个启动某个后台线程的类:该类可能有一个Run()启动这些线程的Stop()方法,以及一个正确停止它们的方法。这些后台线程中的一些可能是手动创建的,其他可能由 a 管理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 上的“停止”按钮时,将调用该方法。应该如何实现这些方法才能通过 UI 调用?它们都应该是异步的吗?如果是,如何处理某些线程无法停止的可能性?Stop()

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

4

2 回答 2

3

丝线绕来绕去,不为所动。另一方面,你只是失去了解决它的任何方法。

于 2012-09-18T01:29:56.543 回答
2

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

于 2012-09-18T01:30:31.660 回答