【问题标题】:What happens if a Thread object is overwritten when the thread is not yet finished?如果在线程尚未完成时覆盖 Thread 对象会发生什么?
【发布时间】:2012-09-18 01:12:32
【问题描述】:

假设您有一个启动某个后台线程的类:该类可能有一个启动这些线程的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 按钮时调用了 Run() 方法。同样,Stop() 方法在用户单击 UI 上的 Stop 按钮时被调用。应该如何实现这些方法才能通过 UI 调用?它们都应该是异步的吗?如果是,如何处理某些线程无法停止的可能性?

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

【问题讨论】:

    标签: c# .net multithreading


    【解决方案1】:

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

    【讨论】:

    • 不一定是坏事
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      相关资源
      最近更新 更多