#编程
简述:
Task和Thread都能创建用多线程的方式执行代码,但它们有较大的区别。
Task是将多个操作封装成一个概念上原子操作。但这个操作由哪个Thread甚至多个Thread来处理处理你并不清楚。总之就是可以被正常完成。
Thread仅仅是一条线程,所有操作都是这个Thread一个完成的。
thread是单核多线程,task是多核多线程。
Task较新,发布于.NET 4.5,能结合新的async/await代码模型写代码,它不止能创建新线程,还能使用线程池(默认)、单线程等方式编程,在UI编程领域,Task还能自动返回UI线程上下文,还提供了许多便利API以管理多个Task。用表格总结如下:
区别 | Task | Thread |
---|---|---|
.NET 版本 | 4.5+ | 1.1 |
async/await | 支持 | 不支持 |
创建新线程 | 支持 | 支持 |
线程池/单线程 | 支持 | 不支持 |
返回主线程 | 支持 | 不支持 |
管理API | 支持 | 不支持 |
开始一个Task ,Task.Run(()=>{.......;});
开始一个Task最简单的办法就是使用Task.Run(.net4.5,4.0的时候是Task.Factory.StartNew)传入一个Action委托即可,代码示例:
Task.Run( => { Console.WriteLine( "do it"); });
Task默认使用线程池,也就是后台线程:当主线程结束时,你创建所有的tasks都会结束。
Task.Run返回一个Task对象,可以使用它来监视其过程
在Task.Run之后,我们没有调用Start,因为该方法创建的是“热”任务(hot task)
可以通过task的构造函数创建“冷”任务(cold task),但开发中很少这么干
通过Task的Status属性来跟踪task的执行状态。
以下是几个从视频授课里学的几种简便的多线程编程使用方式,
示例一:Thread用法
Thread ts = new Thread(() => {
Thread.Sleep(3000);
MessageBox.Show("菜都做好了");
});
ts.Start();
示例二:异步多线程,注:此方法是按顺序执行。
await Task.Run(() =>
{
Thread.Sleep(3000);
MessageBox.Show("素菜做好了");
});
await Task.Run(() =>
{
Thread.Sleep(3000);
MessageBox.Show("荤菜做好了");
});
MessageBox.Show("菜都做好了");
示例三:异步多线程并行,注:线程集合内的线程以并行的方式同步执行。
List<Task> tsList = new List<Task>();
tsList.Add(Task.Run(() =>
{
Thread.Sleep(3000);
MessageBox.Show("素菜做好了");
}));
tsList.Add(Task.Run(() =>
{
Thread.Sleep(5000);
MessageBox.Show("荤菜做好了");
}));
Task.WhenAll(tsList).ContinueWith(t =>
{
MessageBox.Show("菜都做好了");
});
声明:有的资源均来自网络转载,版权归原作者所有,如有侵犯到您的权益 请联系邮箱:123456@qq.com 我们将配合处理!
原文地址:C#多线程编程发布于2024-04-01 12:02:34