首頁 >後端開發 >C#.Net教程 >如何區分c# 前台和後台線程

如何區分c# 前台和後台線程

coldplay.xixi
coldplay.xixi轉載
2020-07-09 17:41:043510瀏覽

如何區分c# 前台和後台線程

Net的公用語言執行階段(Common Language Runtime,CLR)能區分兩種不同類型的執行緒:前台執行緒和後台執行緒。這兩者的區別就是:應用程式必須運行完所有的前台線程才可以退出;而對於後台線程,應用程式則可以不考慮其是否已經運行完畢而直接退出,所有的後台線程在應用程式退出時都會自動結束。

這麼說可能不知道有什麼差別:

<strong>前台執行緒</strong>後台執行緒的差別和聯絡:

1、後台執行緒不會阻止進程的終止。屬於某個行程的所有前台執行緒都終止後,該行程就會被終止。所有剩餘的後台執行緒都會停止且不會完成。

2、可以在任何時候將前台線程修改為後台線程,方式是設定Thread.IsBackground 屬性。

3、不管是前台線程還是後台線程,如果線程內出現了異常,都會導致進程的終止。

4、託管執行緒池中的執行緒都是後台線程,使用new Thread方式建立的執行緒預設都是前台執行緒。

.net環境使用Thread建立的線程預​​設是前台線程,即線程屬性IsBackground=false,在進程中,只要有一個前台線程未退出,進程就不會終止。主線就是一個前台線。而後台執行緒不管執行緒是否結束,只要所有的前台執行緒都退出(包括正常退出和異常退出)後,進程就會自動終止。一般後台執行緒用來處理時間較短的任務,如在一個Web伺服器中可以利用後台執行緒來處理客戶端發過來的請求資訊。而前台執行緒一般用於處理需要長時間等待的任務,如在Web伺服器中的監聽客戶端請求的程序,或是定時對某些系統資源進行掃描的程序。

案例

static void Main(string[] args)
    {
      SampleTread thead = new SampleTread(10);

      SampleTread theadback = new SampleTread(10);
      var theadone = new Thread(thead.CountNumbers);
      var theadtwo = new Thread(theadback.CountNumbers);
      theadtwo.IsBackground = true;
      theadone.Start();
      theadtwo.Start();
      
    }
class SampleTread
  {
    private readonly int _iterations;
    public SampleTread(int iterations)
    {
      this._iterations = iterations;
    }
    public void CountNumbers()
    {
      for (int i = 0; i < _iterations; i++)
      {
        Sleep(TimeSpan.FromSeconds(0.5));
        Console.WriteLine($"{ CurrentThread.Name}print{i}");
      }
    }
  }

分析

#運行結果為,當前台執行緒執行完畢後那麼後台執行緒也會退出。其實在作業系統中根本沒有前後線程這個概念,那為什麼會有這個東西呢?

意義何在?本來是這樣子的當我們的主線程結束的時候其他線程也應該結束,因為釋放了我們的線程物件了,如果主線程結束的時候不釋放其他線程那麼其他線程的危害性真的太大了,所以c#為我們提供了前台線程和後台線程這個概念讓操作線程變得比較簡單。

至於怎麼用,看具體項目了,後台執行緒往往起到輔助性的功能。比如說winform,在關閉視窗後執行緒進程依然沒有關閉,這就是因為關閉close後去執行關閉主執行緒,其他執行緒關閉後主執行緒才會安全關閉。

這就是為什麼你還可以看到其他執行緒的原因,當然你看到還有其他執行緒的原因可能是多個行程,其他行程的主執行緒沒有關閉,這個需要具體分析了。

相關學習推薦:C影片教學

以上是如何區分c# 前台和後台線程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除