如果对象设置为空,将丢弃线程

问题描述 投票:1回答:2

我有ClassA班

public class ClassA{
  public ClassA()
  {
    Thread t = new Thread(EndlessLoop);
    t.IsBackground = True;
    t.Start();
  }
  private void EndlessLoop()
  {
    while (True)
    {
    // do something 
    }
  }
}

并且我不确定如果将ClassA对象设置为null,线程是否会被丢弃

ClassA a = new ClassA();

# will the thread exit ?
a = null;

或者也许我应该实现IDisposable,并手动调用它?

c# multithreading object dispose
2个回答
1
投票

一旦启动,线程将在例程结束(或调用Thread.Abort或程序退出)之后终止。 Thread类未实现IDisposable,因此没有要调用的Dispose方法。要终止长时间运行的线程,可以设置一个线程定期检查的标志。

Thread对象超出范围且不再被引用时,可以进行垃圾回收。但是,生成的线程将继续运行。


0
投票

如果删除对与之对应的Thread对象的最后引用-C# Thread object lifetime,则OS线程将不会发生任何事情。线程将继续运行代码,直到方法完成(在while(true)情况下不太可能),线程以Abort终止(不要这样做-What's wrong with using Thread.Abort())或进程结束。

唯一的好选择是以某种方式通知线程代码它应该完成(即使用事件,甚至使用受lock保护的全局变量)。还应考虑将Taskasync与相应的取消机制一起使用是否会简化代码(它不能解决无限循环问题,但可以提供编写可取消操作的良好框架)。

请注意,您不能“处理”线程,因为它没有实现处理(Do we need to dispose or terminate a thread in C# after usage?),

© www.soinside.com 2019 - 2024. All rights reserved.