Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果线程对象在线程尚未完成时被覆盖,会发生什么情况?_C#_.net_Multithreading - Fatal编程技术网

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

C# 如果线程对象在线程尚未完成时被覆盖,会发生什么情况?,c#,.net,multithreading,C#,.net,Multithreading,假设您有一个类在其中启动一些后台线程:这个类可以有一个启动这些线程的Run()方法和一个正确停止这些线程的Stop()方法。其中一些后台线程可能是手动创建的,其他线程可能由计时器管理,该计时器在调用上述Run()方法时激活 public void Run() { m_ShutdownRequested = false; // shutdown flag disabled m_WorkerThread = new Thread(Work) { IsBackground = tru

假设您有一个类在其中启动一些后台线程:这个类可以有一个启动这些线程的
Run()
方法和一个正确停止这些线程的
Stop()
方法。其中一些后台线程可能是手动创建的,其他线程可能由
计时器管理,该计时器在调用上述
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按钮,该类的实例将有一些线程尚未停止。但是,启动
Run()
方法时,上一个
m_WorkerThread
实例将被覆盖:如果在线程尚未完成时执行此覆盖,会发生什么情况?

线程将继续运行,不受影响。另一方面,您只是失去了处理它的任何方法。

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

不一定是坏事