多线程无论是哪种支持多线程的高级语言都是重中之重,从某种意义上讲,多线程可以提供应用程序的运行效率,尤其是多CPU时代。在.NET1.0就出现了多线程Thread,再到.NET4.5的语法糖await async,每次多线程的新功能都是对上一版本多线程功能的提升和改进(并不是替代),让多线程越来越容易上手,效率也越来越高。多线程也是面试常考的话题之一,几个版本的多线程都会考到。本文将简介.NET多线程的发展历程,以及它们的优缺点。下图为发展历程。.
.NET多线程发展历程
1、Thread
Thread是.NET Frameworkd 1.0版本就有的功能,命名空间:System.Threading。
优点:提供了丰富的多线程操作API
缺点:线程个数的使用不能限制,同时创建多个容易死机,以及无法复用线程等。
使用案例:
class Program
{
static void Main(string[] args)
{
//创建一个实例执行
ThreadTest test=new ThreadTest();
//调用test实例的MyThread方法
Thread thread = new Thread(new ThreadStart(test.MyThread));
//启动线程
thread.Start();
Console.Read();
}
}
class ThreadTest
{
public void MyThread()
{
Console.WriteLine("这是一个方法实例");
}
}
2、ThreadPool
ThreadPool线池是.NET Frameworkd 2.0推出的新特性,它的出现从某种意义上来将改进了Thread的缺点。
优点:解决了线程个数的限制以及线程的复用,避免重复申请和释放
缺点:在线程顺序控制方面不好用,API较少而且线程等待问题解决起来较为麻烦。
使用案例:
static void DoSomething(object value)
{
Console.WriteLine(value);
}
//调用简写
ThreadPool.QueueUserWorkItem(e =>
{
DoSomething(e);
}, "pram1");
可以设置线程数量最大值,但必须大于其CPU核数,否则无效。
3、Task
Task是.NET Frameworkd 3.0推出的新特性,被称为线程最佳实践,API也最多,Task的背后的实现也是使用了线程池线程。
优点:丰富的API,以及多线程的管理方便
缺点:线程数量控制较为麻烦,这个在Parallel得到了改进,Parallel可以启动多线程。
使用案例:
var testTask = new Task(() =>
{
Console.WriteLine("task start");
});//这种必须Start
testTask.Start();
var factoryTeak = Task.Factory.StartNew(() =>
{
Console.WriteLine("factory task start");
});
Task.Run(() => { Console.Write("aaaaa"); });
4. await async await async是.NET4.5的新特征,是C#的语法糖,在.NET Core以上版本发扬光大了,可以说无处不在。它让程序员使用后端异步更加方便快捷。这里就不列出优缺点了,反正它是最好用的,现在.NET6都在大量使用。
使用案例:
public ActionResult Index()
{
var t = Test();
var i = t.Result;
return View();
}
public async Task<int> Test()
{
return await Task.Run(() =>
{
var i = 0;
i++;
return i;
});
}
5、结语
本文讲述了.NET多线程技术的发展历程以及它们各自的优缺点,并且列出了使用案例,仅供参考。希望本文对你有所帮助,欢迎大家留言讨论或者提出异议。