C#多執行緒基礎,實現主子執行緒有序輸出
阿新 • • 發佈:2018-11-29
建立控制檯程式
using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace AsyncThread { public class Program { static void Main(string[] args) { Func<int> func1 = () => ThreadTest1(); var begin = func1.BeginInvoke(null, null); int result = func1.EndInvoke(begin); // 等待執行緒結束方法1 Console.WriteLine($"ThreadTest1子執行緒結束,result={result}"); //-------------------------------------------------------- TaskFactory fanctory = new TaskFactory(); List<Task> taskList = new List<Task>(); taskList.Add(fanctory.StartNew(() => { for (int i = 0; i < 10; i++) { Thread.Sleep(100); Console.WriteLine($"fanctory任務{i}"); } })); Task.WaitAll(taskList.ToArray()); // 等待執行緒結束方法2 //-------------------------------------------------------- for (int i = 0; i < 5; i++) { int k = i; Console.WriteLine($"【2】--------主執行緒{k}啟動-----------"); taskList.Add(fanctory.StartNew(() => { for (int j = 0; j < 5; j++) { Console.WriteLine($"【2】.子執行緒{k}-{j}啟動"); } })); Task.WaitAll(taskList.ToArray()); // 等待該主執行緒裡的所有子執行緒都結束再進入下一個主執行緒 } //-------------------------------------------------------- for (int j = 0; j < 10; j++) { int k = j; Task.Run(() => { int res = ThreadTest1(); Console.WriteLine($"《3》.子執行緒{k}啟動,結果={res}"); return res; }); Task.WaitAll(); // 確保for迴圈按順序執行 } //--------------------------Thread-------------------------------- for (int i = 1; i < 5; i++) { Console.WriteLine("----------Thread主執行緒 " + i + " 開始------------"); Thread thread1 = new Thread(()=> { DosomeThing();}); // 調無參方法 //Thread thread2 = new Thread(new ThreadStart(DosomeThing)); // 調無參方法 Thread thread3 = new Thread(new ParameterizedThreadStart(DosomeThing)); // 帶引數 thread1.Start(); //thread2.Start(); thread3.Start(i); Thread.Sleep(1000); } //-------------------------------執行緒池---------------------------------------// ThreadPool.QueueUserWorkItem(DosomeThing, "********執行緒池測試引數***********"); Console.WriteLine($"ThreadTest1主執行緒結束"); Console.ReadKey(); } /// <summary> /// /// </summary> /// <returns></returns> private static int ThreadTest1() { int result = 0; for (int i = 0; i < 1000000; i++) { result += i; } return result; } /// <summary> /// /// </summary> public static void DosomeThing() { for (int i = 1; i < 5; i++) { //Thread.Sleep(1000); Console.WriteLine("這是不帶引數的子執行緒:" + i); } } /// <summary> /// /// </summary> /// <param name="paramer"></param> public static void DosomeThing(object paramer) { for (int i = 1; i < 4; i++) { //Thread.Sleep(1000); Console.WriteLine("這是帶引數子執行緒 " + i + " 的引數 " + paramer); } } } }
執行結果圖