注:以下例子需要先创建一个WinForm或者WPF界面
① 无多线程执行
Thread.Sleep(1000);
MessageBox.Show("做素菜");
Thread.Sleep(2000);
MessageBox.Show("做肉菜"); //单线程,顺序执行,执行时无法执行其他操作(比如窗口无法拖动
②传统多线程Thread
Thread t = new Thread(() =>
{
Thread.Sleep(1000);
MessageBox.Show("做素菜");
Thread.Sleep(2000);
MessageBox.Show("做肉菜");
});
t.Start(); //Thread多线程,执行的时候窗口可以拖动
③Task 多线程执行
Task.Run(() =>
{
Thread.Sleep(1000);
MessageBox.Show("做素菜");
Thread.Sleep(2000);
MessageBox.Show("做肉菜");
});
④ Task多线程等待执行完毕
await Task.Run(() =>
{
Thread.Sleep(1000);
MessageBox.Show("做素菜");
Thread.Sleep(2000);
MessageBox.Show("做肉菜");
});//等待线程执行完毕
MessageBox.Show("菜做完了,开始吃饭");
⑤Task多个线程同时执行,并等待执行完毕
List<Task> t = new List<Task>(); //创建一个任务列表
t.Add(Task.Run(() =>
{
Thread.Sleep(1000);
MessageBox.Show("做素菜");
}));
t.Add(Task.Run(() =>
{
Thread.Sleep(2000);
MessageBox.Show("做肉菜");
}));
Task.WhenAll(t).ContinueWith((t) =>
{
MessageBox.Show("开始吃饭");
});
⑥ Task多线程和Thread多线程的区别:
1、基于不同的 .NET 框架:Thread 是基于 Windows 操作系统提供的 API 实现,而 Task 则是基于 .NET框架提供的 TPL(Task Parallel Library)实现。
2、默认执行线程池:Thread 默认使用前台线程,而 Task 默认使用后台线程。这意味着,Thread 会阻塞主线程,而 Task不会。
3、异步执行:Task 支持异步执行,而 Thread 不支持。这意味着,在使用 Task 时,可以通过 4、await 和 async关键字轻松实现异步编程,而 Thread 则需要手动管理线程的启动和等待。
4、异常处理:Task 提供了更好的异常处理机制,可以将异常传递给调用方,而 Thread 则需要在每个线程中处理异常。
5、任务调度器:Task 提供了任务调度器(TaskScheduler),可以控制任务的并发性和调度方式,而 Thread 则没有这个功能。
6、返回值:Task 可以有返回值,而 Thread 没有。这是因为 Task 是基于 TPL 实现的,可以利用 .NET框架提供的并发编程模型来实现任务之间的依赖和调度。