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,效果上是一样的。

posted on 2023-01-11 11:39  西点肥牛  阅读(119)  评论(0编辑  收藏  举报

导航