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

3
假设您有一个类,其中启动了一些后台线程:该类可能具有一个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实例将被覆盖:如果在线程尚未完成时执行此覆盖,会发生什么?
2个回答

3
线程毫不受影响地继续执行,而你则失去了对其的任何控制。

不一定是坏事 <g> - Martin James

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接