线程:
每个Windows进程都有用于进入程序的进入点(entry point)的主线程(Main Thread),例如.Net framework执行程序(控制台、Windows WPF等应用程序)使用Main()方法作为程序的进入点,调用该方法时会自动建立主线程。
线程是Windows进程中的独立执行单元,每个线程都有一个主线程(在执行进入点时建立)并且每个线程还可以以程序方式建立新的线程。
线程的分配与启动需要一定的时间与成本开销,所以这个过程并不是实时的。
Task类:
与Thread相比,Task是更抽象的概念,MSDN说明就简单一句:“表示异步操作”,即为能以多线程执行的异步操作,从net framework4.5开始,要建立实现Task后台线程最简单的方式就是使用静态方法Task.Run(),在.Net Framework 4.0可以调用Task.Factory.StartNew方法,可以实现相同的效果
持续工作会告诉Task在完成后继续执行后续的作业,持续工作通常由一个回调方法来实现,它会在任务完成后执行一次。 将一个Task加上持续工作又两种方法,
Task<int> task=Task.Run(
()=>Enumerable.Range(1,5000000).Count(n=>(n%3)==0);
var awaiter=task.GetAwaiter();
awaiter.OnCompleted(()=>
{
int result=awaiter.GetResult();
Console.WriteLine("整除3的个数有:"+Result);
Console.WriteLine("Task执行中...")
Console.ReadLine();
});
调用Task.GetAwaiter方法会返回一个awaiter(等待者)对象,它会让先前的Task在完成或出错之后执行一个委派,如果先前的Task出现错误,那么当接续工作调用awaited.GetResult()时就会弹出例外。使用GetResult的好处是,当先前的Task出错时,例外可以直接弹出,而不会封装在 aggregateException中。
注明:内容根据书籍”ASP.Net MVC5网站开发之美“整理而来