1、通过Task开启线程
private void OpenThread()
{
Task task1 = new Task(() =>
{
this.DoSomethingLong("new Task(Action)");
Console.WriteLine($"通过new Task(Action)开启了一个线程,线程ID:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
task1.Start();
Task task2 = Task.Run(() =>
{
this.DoSomethingLong("Task.Run(Action)");
Console.WriteLine($"通过Task.Run(Action)开启了一个线程,线程ID:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
Func<int> func = () => { return DateTime.Now.Year; };
Task<int> task3 = Task.Run(func);
int year = task3.Result;
Console.WriteLine($"有返回值的任务 今年是 {year} 年");
TaskFactory taskFactory1 = new TaskFactory();
taskFactory1.StartNew(() =>
{
this.DoSomethingLong("new TaskFactory() taskFactory.StartNew(Action)");
Console.WriteLine($"通过new TaskFactory() 然后taskFactory.StartNew(Action)开启了一个线程,线程ID:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
TaskFactory taskFactory2 = Task.Factory;
taskFactory2.StartNew(() =>
{
this.DoSomethingLong("Task.Factory taskFactory.StartNew");
Console.WriteLine($"通过Task.Factory 然后taskFactory.StartNew(Action)开启了一个线程,线程ID:{Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
}
![启动线程](https://img-blog.csdnimg.cn/05fb6533575b4150bbca54b1e3f5b4e6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Zub5bmz5LqM5YWt,size_20,color_FFFFFF,t_70,g_se,x_16)
2、Task来源
private void TaskSource()
{
ThreadPool.SetMaxThreads(14, 14);
List<int> countlist = new List<int>();
List<Task> tasklist = new List<Task>();
for(int i = 0; i < 100; i++)
{
int k = i;
tasklist.Add(Task.Run(() =>
{
countlist.Add(Thread.CurrentThread.ManagedThreadId);
Console.WriteLine($"k={k}, threadId = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}));
}
Task.WaitAll(tasklist.ToArray());
Console.WriteLine($"最大线程为:{countlist.Distinct().Count()}");
}
![Task也是来自于线程池](https://img-blog.csdnimg.cn/c745b3ed3965420bb530ab350eb5073b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Zub5bmz5LqM5YWt,size_20,color_FFFFFF,t_70,g_se,x_16)
3、父子线程场景A
private void ParentChildThreadA()
{
Task task = new Task(() =>
{
Console.WriteLine($"父线程task线程开始了 threadID={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Task task1 = new Task(() =>
{
Console.WriteLine($"task1 Start ID = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Thread.Sleep(1500);
Console.WriteLine($"task2 Ene ID = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
Task task2 = new Task(() =>
{
Console.WriteLine($"task1 Start ID = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Thread.Sleep(1500);
Console.WriteLine($"task2 Ene ID = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
task1.Start();
task2.Start();
Console.WriteLine($"父线程task结束了 threadID={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
task.Start();
task.Wait();
Console.WriteLine($"UI线程 threadID = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}
![父子线程场景A](https://img-blog.csdnimg.cn/2ad641a034ee4cb3a5a9ff970cc8a877.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Zub5bmz5LqM5YWt,size_20,color_FFFFFF,t_70,g_se,x_16)
4、父子线程场景B
private void ParentChildThreadB()
{
Task task = new Task(() =>
{
Console.WriteLine($"父线程task开始了 threadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Task task1 = new Task(() =>
{
Console.WriteLine($"task1 Start ID = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Thread.Sleep(1500);
Console.WriteLine($"task1 End ID = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}, TaskCreationOptions.AttachedToParent);
Task task2 = new Task(() =>
{
Console.WriteLine($"task2 Start ID = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Thread.Sleep(3000);
Console.WriteLine($"task2 End ID = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}, TaskCreationOptions.AttachedToParent);
task1.Start();
task2.Start();
Console.WriteLine($"父线程task结束了 threadID={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
task.Start();
task.Wait();
Console.WriteLine($"UI线程 threadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}
![父子线程场景B](https://img-blog.csdnimg.cn/07a40e327be54a29ae3d725ada4f2215.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Zub5bmz5LqM5YWt,size_20,color_FFFFFF,t_70,g_se,x_16)
5、线程优先级
private void ThreadPriority()
{
Task task = new Task(() =>
{
Console.WriteLine("这是开启了一个线程……");
}, TaskCreationOptions.PreferFairness);
task.Start();
task.Wait();
Console.WriteLine($"UI线程 ThreadId = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}
![线程优先级](https://img-blog.csdnimg.cn/c6a04253cf66458f9dd94486b1d90520.png)
6、Sleep And Delay
private void SleepAndDelay()
{
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine("Sleep之前");
Thread.Sleep(2000);
Console.WriteLine("Sleep之后");
stopwatch.Stop();
Console.WriteLine($"Sleep 耗时 {stopwatch.ElapsedMilliseconds} ms");
}
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine("Delay之前");
Task.Delay(2000);
Console.WriteLine("Delay之后");
}
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine("Delay.ContinueWith之前");
Task.Delay(2000).ContinueWith(s =>
{
stopwatch.Stop();
Console.WriteLine($"Delay.ContinueWith 耗时 {stopwatch.ElapsedMilliseconds} ms");
Console.WriteLine("这是一个延迟任务");
});
Console.WriteLine("Delay.ContinueWith之后");
}
}
![SleepAndDelay](https://img-blog.csdnimg.cn/a8dabea4eab1410291f4c45d40a295f5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Zub5bmz5LqM5YWt,size_19,color_FFFFFF,t_70,g_se,x_16)
7、线程ID和任务ID
private void ThreadIdAndTaskId()
{
Task t1 = Task.Run(() =>
{
Console.WriteLine($"1.1 ThreadId = {Thread.CurrentThread.ManagedThreadId.ToString("00")} " +
$"任务Id = {Task.CurrentId}");
});
t1.Wait();
Console.WriteLine($"1.2 ThreadId = {Thread.CurrentThread.ManagedThreadId.ToString("00")} " +
$"任务Id = {t1.Id}");
Task t2 = Task.Run(() =>
{
Console.WriteLine($"2.1 ThreadId = {Thread.CurrentThread.ManagedThreadId.ToString("00")} " +
$"任务Id = {Task.CurrentId}");
});
t2.Wait();
Console.WriteLine($"2.2 ThreadId = {Thread.CurrentThread.ManagedThreadId.ToString("00")} " +
$" 任务Id = {t2.Id}");
}
![线程ID和任务ID](https://img-blog.csdnimg.cn/8821e6de98314ea9abc778a2e38bc20e.png)
8、应用场景举例
private void MultithreadingUsageScenario()
{
Console.WriteLine("开始培训……");
Console.WriteLine("老师讲课……");
this.Teach("lesson01");
this.Teach("lesson02");
this.Teach("lesson03");
this.Teach("lesson04");
Console.WriteLine("开始直播平台项目实战……");
List<Task> list = new List<Task>();
TaskFactory factory = new TaskFactory();
list.Add(factory.StartNew(() => this.Coding("小明", "WebAPI")));
list.Add(factory.StartNew(() => this.Coding("小红", "视频流处理")));
list.Add(factory.StartNew(() => this.Coding("小刚", "搭建集群")));
list.Add(factory.StartNew(() => this.Coding("小兰", "搭建RabbitMQ异步队列")));
factory.ContinueWhenAll(list.ToArray(), s =>
{
Console.WriteLine($"factory.ContinueWhenAll ThreadId = {Thread.CurrentThread.ManagedThreadId.ToString("00")} " +
$"项目大功告成,摆个庆功宴");
});
factory.ContinueWhenAny(list.ToArray(), s =>
{
Console.WriteLine($"factory.ContinueWhenAny ThreadId = {Thread.CurrentThread.ManagedThreadId.ToString("00")} " +
$"xxx同学第一个完成任务,获取一个红包奖励");
});
Task.WaitAny(list.ToArray());
Console.WriteLine("有一个人完成任务,老师开始准备环境……");
Task.WaitAll(list.ToArray());
Console.WriteLine("直播平台开发完成……老师做出点评……");
}
![场景应用](https://img-blog.csdnimg.cn/adaa007c99dc4207a39fff8c23b148a3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Zub5bmz5LqM5YWt,size_20,color_FFFFFF,t_70,g_se,x_16)
9、控制线程数量
private void ControlNumThread()
{
List<Task> taskList = new List<Task>();
for(int i = 0; i < 100; i++)
{
int k = i;
if(taskList.Count(t=>t.Status != TaskStatus.RanToCompletion) > 20)
{
Task.WaitAny(taskList.ToArray());
taskList = taskList.Where(t => t.Status != TaskStatus.RanToCompletion).ToList();
}
taskList.Add(Task.Run(() =>
{
Console.WriteLine($"开启的第 {k} 个线程,ThreadId = {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}));
}
}
private method
#region private method
private void DoSomethingLong(string name)
{
Console.WriteLine($"DoSomethingLong Start {name} {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
long lResult = 0;
Thread.Sleep(2000);
Console.WriteLine($"DoSomethingLong End {name} {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} {lResult}");
}
private void Teach(string lesson)
{
Console.WriteLine($"{lesson}课程开始了……");
Console.WriteLine($"{lesson}课程讲完了……");
}
private void Coding(string name, string projectName)
{
Console.WriteLine($"Coding Start {name} {projectName} {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}");
long lResult = 0;
for (int i = 0; i < 1_000_000_000; i++)
{
lResult += i;
}
Console.WriteLine($"Coding End {name} {projectName} {Thread.CurrentThread.ManagedThreadId.ToString("00")} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} {lResult}");
}
#endregion