C# 线程(三)——前台和后台线程

默认情况下,我们显式创建的线程是前台线程。 只要前台线程中的任何一个正在运行,它就可以使应用程序保持活动状态,而后台线程则不会。 一旦所有前台线程完成,应用程序结束,所有仍在运行的后台线程终止。
您可以使用其IsBackground属性查询或更改线程的背景状态。 下面给一个例子:

class PriorityTest
{
  static void Main (string[] args)
  {
    Thread worker = new Thread ( () => Console.ReadLine() );
    if (args.Length > 0) worker.IsBackground = true;
    worker.Start();
  }
}

如果不带任何参数调用此程序,则工作线程将处于前台状态,并将在ReadLine语句上等待用户按Enter。 同时,主线程退出,但是应用程序继续运行,因为前台线程仍然处于活动状态。
另一方面,如果将参数传递给Main(),则会为新的线程分配后台状态,并且在主线程结束(终止ReadLine)时,程序几乎立即退出。
当进程以这种方式终止时,将无法执行后台(IsBackground = true的线程)线程中的finally块。 如果您的程序最终使用(或使用)块来执行清理工作(例如释放资源或删除临时文件),则会出现问题。 为了避免这种情况,您可以在退出应用程序时显式等待此类后台线程。 有两种方法可以实现此目的:

  • 如果您自己创建了线程,请在该线程上调用Join
  • 如果您使用的是线程池(poopled thread),请使用事件等待句柄 event wait handle
    在这两种情况下,我们都应指定一个超时时间,以便在由于某种原因无法完全退出进程。 这是您的备份退出策略:最后,我们希望我们的应用程序关闭-无需用户从任务管理器中寻求帮助!

你可能感兴趣的:(c#,.net,core,前台和后台,线程,c#)