程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#掃盲之:前台線程後台線程

C#掃盲之:前台線程後台線程

編輯:C#基礎知識

1.線程分類

線程由程序員創建,可是創建的方式不同,總體來說有兩種,一種是個人構造,也就是使用thread類new線程對象創建,這一類線程是大部分程序員知道的,也叫專用線程;還有一種是由CLR創建,這一類線程主要存在於線程池中,也叫線程池線程。對於這兩種線程的好壞,個人建議最好使用線程池線程,不要大量使用專用線程,對於這一個問題的探討,讀者可以做研究,本文不做討論。

前台線程和後台線程

而從回收的角度來看又可分為前台線程和後台線程

  後台線程:後台線程是可以隨時被CLR關閉而不引發異常的,也就是說當後台線程被關閉時,資源的回收是立即的,不等待的,也不考慮後台線程是否執行完成,就算是正在執行中也立即被終止。【後台,存在於黑暗之中默默無聞,它的消亡和存在,別人也感受不到】

  前台線程:前台線程是不會被立即關閉的,它的關閉只會發生在自己執行完成時,不受外在因素的影響。假如應用程序退出,造成它的前台線程終止,此時CLR仍然保持活動並運行,使應用程序能繼續運行,當它的的前台線程都終止後,整個進程才會被銷毀。

所以應該使用前台線程執行確實想完成的任務,比如數據的拷貝等等.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;

class class1
{
    static void Main(string[] args)
    {
        Thread tmpThread = new Thread(WriteFile);//默認為前台線程
        tmpThread.Name = "TestThread";
        //tmpThread.IsBackground = true;
        tmpThread.Start();

        //Console.ReadKey();
    }

    /// <summary>
    /// 寫文件
    /// </summary>
    static void WriteFile()
    {
        while (true)
        {
            using (FileStream fs = File.Open(@"D:\test.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
            {
                byte[] buff = System.Text.UnicodeEncoding.UTF8.GetBytes(string.Format("Time:{0}\r\n", DateTime.Now.ToString()));
                fs.Write(buff, 0, buff.Length);
            }
            Thread.Sleep(10);
        }

    }
}

在上面的程序中我們使用了一個線程默認為前台線程,當控制台程序的Main函數執行完時,前台線程任然在寫文件,如下如:

2.說明

(1)在任何時候我們都可以通過線程的IsBackground屬性改變線程的前後台屬性

(2)應用程序的主線程以及使用Thread構造的線程都默認為前台線程

    線程池線程也就是使用 ThreadPool.QueueUserWorkItem()和Task工廠創建的線程都默認為後台線程

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved