一、多線程介紹
C#通過多線程支持并行執行的代碼。一個線程是一個獨立執行的路徑,可以同時與其他線程一起運行。一個C#客戶端程序(Console,WPF,Winows Forms)開始于一個單獨的線程,該線程由CLR和操作系統自動地創建,我們稱它為主線程,而且可以通過創建附加的線程來實現多線程。
二、初探
1.創建第一個多線程程序
2.打開visual studio 2015。新建一個控制臺應用程序ThreadConsoleApp。如下圖。
3.此項目使用.net framework 4.5.2。
4.代碼如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //引入線程 namespace ThreadConsoleApp { class Program { static void Main(string[] args) { //創建一個線程來運行PrintNumber,當我們構造一個線程時,ThreadStart或ParameterizedThreadStart實例委托會傳給構造函數 //我們只需要指定不同線程需要運行的方法名,如下所示。編譯器會自動在后臺創建這些對象。 Thread t = new Thread(PrintNumber); //啟動線程 t.Start(); PrintNumber(); Console.Read(); } static void PrintNumber() { Console.WriteLine("第一個多線程程序開始。。。。"); for (int i = 0; i <20; i++) { long time = DateTime.Now.Ticks; Console.WriteLine(string.Format("Ticks:{0} == {1}",time,i)); } } } }
5.程序運行結果如下
從上圖的結果圖中可以看出來,兩組范圍為20的數字是隨機交替出現的,說明PrintNumber方法即運行在主線程中,又運行中子線程中。
三、暫停線程(Sleep)
1.代碼如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //引入線程 namespace ThreadConsoleApp { class Program { static void Main(string[] args) { Thread t = new Thread(PrintNumberDely); //啟動線程 t.Start(); PrintNumber(); Console.Read(); } static void PrintNumber() { Console.WriteLine("第一個多線程程序開始。。。。Second:" + DateTime.Now.Second); for (int i = 0; i <10; i++) { Console.WriteLine(string.Format("{0}",i)); } } /// <summary> /// 暫停2秒的方法 /// </summary> static void PrintNumberDely() { Console.WriteLine("第一個多線程暫停程序開始。。。。"); for (int i = 0; i < 10; i++) { Console.WriteLine(string.Format("Second:{0} == {1}", DateTime.Now.Second, i)); Thread.Sleep(TimeSpan.FromSeconds(2)); } } } }
2.結果如下。
圖1
圖2
看結果圖,如上面2圖。當程序運行時,創建一個子線程運行PrintNumberDely()方法,然后執行PrintNumber,但是由于PrintNumberDely方法中存在暫停代碼,所以每隔2秒才打印一個數字。
四、線程等待(Join)
1.代碼如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; //引入線程 namespace ThreadConsoleApp { class Program { static void Main(string[] args) { Console.WriteLine("開始"); Thread t = new Thread(PrintNumberDely); //啟動線程 t.Start(); //線程等待 t.Join(); Console.WriteLine("結束"); Console.Read(); } /// <summary> /// 暫停2秒的方法 /// </summary> static void PrintNumberDely() { Console.WriteLine("第一個多線程等待程序開始。。。。"); for (int i = 0; i < 10; i++) { Console.WriteLine(string.Format("Second:{0} == {1}", DateTime.Now.Second, i)); Thread.Sleep(TimeSpan.FromSeconds(2)); } } } }
2.程序運行結果如下圖。
看結果圖,當程序運行時,創建一個子線程運行PrintNumberDely()方法,但是由于我們調用了t.join()方法,所以主線程就會阻塞,直到子線程執行完畢,主線程才會繼續執行,最后打印出“結束”。使用此技術,可以實現兩個線程的同步執行,第一個線程等另一個線程執行完畢,才繼續執行。
注釋join()方法,程序的運行結果如上圖。請自行比較兩個結果的區別。
文章列表