代码之家  ›  专栏  ›  技术社区  ›  enzom83

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

  •  3
  • enzom83  · 技术社区  · 13 年前

    假设你有一个类,在那里你启动了一些后台线程:这个类可能有一个 Run() 启动这些线程的方法,以及 Stop() 方法正确地阻止它们。其中一些后台线程可能是手动创建的,其他线程可能由 Timer ,在上述情况下激活 运行() 方法。

    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调用?它们应该都是异步的吗?如果是,如何处理某些线程无法停止的可能性?

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

    2 回复  |  直到 13 年前
        1
  •  3
  •   spender    13 年前

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

        2
  •  2
  •   Joel Lucsy    13 年前

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

    推荐文章