C# 中使用主进程及子线程
1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4 5 namespace ThreadTest 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 Task parentTask = new Task(() => 12 { 13 Task task1 = new Task(() => { calculate1(); }, TaskCreationOptions.AttachedToParent); 14 Task task2 = new Task(() => { calculate2(); }, TaskCreationOptions.AttachedToParent); 15 task1.Start(); 16 task2.Start(); 17 }); 18 parentTask.Start(); 19 Console.WriteLine("启动主线程"); 20 parentTask.Wait(); 21 Console.WriteLine("线程全部完成!"); 22 Console.Read(); 23 } 24 25 static void calculate1() 26 { 27 int i = 0; 28 while (i++ < 10) 29 { 30 Thread.Sleep(new Random().Next(10, 100)); 31 Console.WriteLine("Task 1:" + i); 32 } 33 } 34 35 static void calculate2() 36 { 37 int i = 0; 38 while (i++ < 10) 39 { 40 Thread.Sleep(new Random().Next(10, 100)); 41 Console.WriteLine("Task 2:" + i); 42 } 43 } 44 } 45 }
运行结果:
启动主线程 Task 2:1 Task 1:1 Task 1:2 Task 2:2 Task 1:3 Task 2:3 Task 1:4 Task 2:4 Task 1:5 Task 2:5 Task 2:6 Task 1:6 Task 1:7 Task 2:7 Task 1:8 Task 2:8 Task 1:9 Task 2:9 Task 2:10 Task 1:10 线程全部完成!
当要执行的线程任务比较耗时时,建议在创建线程对象时传入参数TaskCreationOptions.LongRunning,以此来声明为长时间运行的线程任务。
默认情况下,新建Task线程是从线程池ThreadPool中分配出来的,当使用TaskCreationOptions.LongRunning声明后则是直接新建一个线程。这样就可以避免耗时任务一直占用线程池资源的情况。当然了,也可以直接使用Thread,效果上是一样的。