通常一個程序一個進程,代碼是存在進程中的,進程自己不執行代碼, 執行代碼的是線程。併發
通常一個進程裏就一個線程。(一個商店就一個老闆娘。)this
進程就是在內存中開闢了一個空間。代碼,圖片。。等就存在這個空間裏。代碼線程去執行。spa
默認只有一個線程。線程
systerm.threading //線程操做的類在這個命名空間下。
開啓一個線程,就是建立一個線程對象便可。3d
線程默認狀況下都是前臺線程。調試
要把全部的前臺線程執行完後,程序纔會退出。code
進程裏默認的線程叫主線程或者默認線程,或UI線程。對象
後臺線程,只要全部的前臺線程結束,全部的後臺線程就直接結束。blog
Thread th = new Thread(Sum); th.Name ="線程1"; 給線程取名。調試的時候能夠在輸出中看到具體名稱。 th.IsBackground = true; th.Start(); th.Abort(); 強行終止線程。 Thread.Sleep(1000); 暫停線程,單位是毫秒 Thread cuTh = Thread.CurrentThread 獲得當前線程的引用。Thread類型。 TextBox.CheckForIllegalCrossThreadCalls = false; //關閉空間的跨線程訪問檢查。 不然會出現以下錯誤
同一個進程中的多個線程之間能夠「併發」執行。進程
多個線程訪問同一資源, 可能形成不一樣步的狀況,這個叫作線程重入。
應對此狀況,可加鎖處理。
private void CountNum() { lock (this) { for (int i = 0; i < 10000; i++) { int num = int.Parse(textBox1.Text.Trim()); num++; textBox1.Text = num.ToString(); } } }
ThreadStart ts = new ThreadStart(CountNum); Thread th = new Thread(ts); 等價於 Thread th = new Thread(CountNum); 本質傳的是一個委託對象。 (CountNum是無參方法)
若是須要傳有參方法。
則是建立的ParameterizedThreadStart 的委託對象。
傳參是在Start方法中傳入;start方法有兩個重載。