前言:
如果你的任务是射出一万支箭,如果只有你一个人射箭,那你就只能一箭一箭慢慢地射个老半天。如果你找一万个人,来个万箭齐发,岂不是一下子就完事了。Thread就是能让你万箭齐发的好办法。
如果你的任务还需要汇报射箭的成绩的话,线程就不行了,得用任务。async/await可以帮你还是来个万箭齐发,但你射完不能走,得等那一万个射手给你回报成绩。
如果你本来就只要射一箭就好,那么,async/await能让你在等待报靶的时间里面干点别的小事情,譬如赚上1个亿。如果你射完箭除了等待成绩之外也没别的事情可做,那么,async/await就白用了,和同步没有任何区别。
一:线程
创建线程有两种方式
1.不带参数创建线程
var thread1 = new Thread(ThreadTest1) public static void ThreadTest1() { // 业务代码 } thread1.start();
2.带参数创建线程
var thread2 = new Thread(ThreadTest2); public static void ThreadTest2(object obj) { //业务代码 } thread2.Start(obj);
总结:均没有返回值。主线程结束子线程未必结束,子线程出现问题未必能发现,并处于假死状态。
二:任务
创建任务有三种方式
1.通过构造函数创建(此方法需要手动开始任务)
var task1 = new Task(() => { }); var task2 = new Task<int>(()=> { return 0; });
task1.Start();
task2.Start();
2.使用任务工厂(任务需要长时间运行)
var task1 = Task.Factory.StartNew(() => { }); var task2 = Task.Factory.StartNew(() => { return 0; });
3.Task.Run创建
var task1 = Task.Run(() => { }); var task2 = Task.Run(() => { return 0; });
总结:任务的运行不会阻塞主线程。主线程结束后,任务一定也会结束。任务和主线程关联大,任务出现问题时主线程也会崩溃告知人。所以别用Thread。