C# Thread 和 Task

前言:

  如果你的任务是射出一万支箭,如果只有你一个人射箭,那你就只能一箭一箭慢慢地射个老半天。如果你找一万个人,来个万箭齐发,岂不是一下子就完事了。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。