📜  如何在C#中检查线程是否为后台线程

📅  最后修改于: 2021-05-29 20:50:05             🧑  作者: Mango

众所周知,线程是由Thread类创建和管理的。因此,Thread类提供了一个称为IsBackground属性的属性,以检查给定线程是在后台运行还是在前台运行。如果IsBackground的值设置为true ,则表示该线程是后台线程。或者,如果IsBackground的值设置为false ,则表示该线程是前台线程。

句法:

public bool IsBackground { get; set; }

返回值:如果此线程将成为或即将成为后台线程,则此属性返回true ,否则返回false

异常:如果线程已死,则此属性将提供ThreadStateException

范例1:

// C# program to illustrate the
// concept of Background thread
using System;
using System.Threading;
  
class GFG {
  
    // Main method
    static void Main(string[] args)
    {
        // Creating and initializing thread
        Thread mythr = new Thread(mythread);
  
        // Name of the thread is Geek thread
        mythr.Name = "Geek thread";
        mythr.Start();
  
        // IsBackground is the property
        // of Thread which allows thread
        // to run in the background
        mythr.IsBackground = true;
  
        Console.WriteLine("Main Thread Ends!!");
    }
  
    // Static method
    static void mythread()
    {
  
        // Display the name of the
        // current working thread
        Console.WriteLine("In progress thread is: {0}",
                          Thread.CurrentThread.Name);
  
        Thread.Sleep(1000);
  
        Console.WriteLine("Completed thread is: {0}",
                          Thread.CurrentThread.Name);
    }
}

输出 :

In progress thread is: Geek thread
Main Thread Ends!!

范例2:

// C# program to illustrate the
// concept of IsBackground property
using System;
using System.Threading;
  
class Geeks {
  
    int J;
  
    public Geeks(int J)
    {
        this.J = J;
    }
  
    // This method will display
    // the counting of background
    // and foreground threads
    public void display()
    {
        for (int i = 0; i < J; i++) {
              
            Console.WriteLine("{0} count: {1}", 
             Thread.CurrentThread.IsBackground ? 
                           "Background Thread" : 
                        "Foreground Thread", i);
                          
            Thread.Sleep(250);
        }
          
        Console.WriteLine("{0} finished its counting.",
                    Thread.CurrentThread.IsBackground ?
            "Background Thread" : "Foreground Thread");
    }
}
  
// Driver Class
class GFG {
      
    // Main method
    static void Main()
    {
        // Creating and initializing
        // objects of Geeks class
        // Creating and initializing 
        // objects of Thread class
        Geeks obj1 = new Geeks(5);
        Thread fthr = new Thread(new ThreadStart(obj1.display));
  
        Geeks obj2 = new Geeks(10);
        Thread bthr = new Thread(new ThreadStart(obj2.display));
  
        // bthr thread is a background
        // thread because the value of
        // IsBackground property is true
        bthr.IsBackground = true;
  
        fthr.Start();
        bthr.Start();
    }
}

输出 :

Foreground Thread count: 0
Background Thread count: 0
Background Thread count: 1
Foreground Thread count: 1
Background Thread count: 2
Foreground Thread count: 2
Background Thread count: 3
Foreground Thread count: 3
Background Thread count: 4
Foreground Thread count: 4
Background Thread count: 5
Foreground Thread finished its counting.

笔记:

  • 线程可以是后台线程,也可以是前景线程。后台线程与前台线程相似,不同之处在于后台线程不会阻止进程终止。
  • 一旦属于某个进程的所有前台线程都已终止,公共语言运行库将终止该进程。任何剩余的后台线程都将停止并且无法完成。
  • 主线程或主应用程序线程以及Thread类构造函数创建的所有线程都在前台执行(即,它们的IsBackground属性返回false)。
  • 线程池线程和所有从非托管代码进入托管执行环境的线程都在后台执行(即,它们的IsBackground属性返回true)。

参考:

  • https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.thread.isbackground?view=netframework-4.7.2