CSharp - 一个原始类超出范围时, 线程还会发生什么

  显示原文与译文双语对照的内容
0 0

为了清晰起见,我简化了下面的示例,但我在一个实时生产程序中遇到了这个问题,我看不到它是如何工作的 !


public class Test
{
 static void Main() 
 {
 Counter foo = new Counter();
 ThreadStart job = new ThreadStart(foo.Count);
 Thread thread = new Thread(job);
 thread.Start();
 Console.WriteLine("Main terminated");
 }
}

public class Counter
{
 public void Count()
 {
 for (int i = 0; i <10; i++)
 {
 Console.WriteLine("Other thread: {0}", i);
 Thread.Sleep(500);
 }
 Console.WriteLine("Counter terminated");
 }
}

主例程启动计数器线程,主例程终止。 计数器线程不管给出以下输出进行。


Main terminated 
Other thread: 0
Other thread: 1
Other thread: 2
Other thread: 3
Other thread: 4
Other thread: 5 
Other thread: 6
Other thread: 7 
Other thread: 8 
Other thread: 9
Counter terminated

我的示例程序演示了虽然调用类不再存在,但线程仍然在完成时存活。 然而,我的理解是一旦一个类别超出范围,它的资源最终会被垃圾收集整理。

在我的真实生活场景中,线程执行大量电子邮件持续 1 -2小时。 我的问题是"垃圾收集最终会终止线程,还是GC知道线程仍然在处理"? 我的电子邮件线程总是运行到完成,还是会有异常终止?

时间: 原作者:

0 0

来自 System.Threading.Thread

一旦启动线程,就不必保留对线程对象的引用。 线程继续执行,直到线程过程完成。

因此,即使 Thread 对象未引用,线程仍将运行。

原作者:
...