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

1.線程分類

線程由程序員建立,但是建立的方式不一樣,整體來講有兩種,一種是我的構造,也就是使用thread類new線程對象建立,這一類線程是大部分程序員知道的,也叫專用線程;還有一種是由CLR建立,這一類線程主要存在於線程池中,也叫線程池線程。對於這兩種線程的好壞,我的建議最好使用線程池線程,不要大量使用專用線程,對於這一個問題的探討,讀者能夠作研究,本文不作討論。程序員

前臺線程和後臺線程函數

而從回收的角度來看又可分爲前臺線程和後臺線程spa

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

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

因此應該使用前臺線程執行確實想完成的任務,好比數據的拷貝等等.orm

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屬性改變線程的先後臺屬性blog

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

    線程池線程也就是使用 ThreadPool.QueueUserWorkItem()和Task工廠建立的線程都默認爲後臺線程資源

相關文章
相關標籤/搜索