并发编程简介
读【C#并发编程经典实例.PDF】一书总结:
1、并发:同时做多件事。
2、多线程:并发的一种形式,它采用多个线程来执行程序。所以多线程只是实现并发的一种方法,并发不等于多线程。
3、并行处理:把正在执行的大量任务分隔成小块,分配给多个正在运行的线程。 并行处理是多线程的一种,多线程是并发的一种。
4、异步编程:并发的一种形式,采用 future 形式或者回调机制,以避免产生不必要的线程。在.net,新版的future 类型有Task和Task<TResult>。在旧版中,采用回调或事件(event)。
异步编程的核心是异步操作:启动了的才做将会在一段时间后完成。这个操作正在执行时不会阻塞原来的线程。启动了这个操作的线程可以执行其他任务。当操作结束时,会通知他的future,或者调用回调函数,以便让程序知道任务已执行完成。
使用 async 和 await,使异步编程变得简单。
await关键字的作用:启动一个将被执行的任务(该任务会在新线程里面执行),并立即返回。所以await所在的函数不会被阻塞。当任务完成后,继续执行await关键字后面的代码。
async关键字的作用:主要目的是使用方法内的await关键字生效。如果async 方法有返回值,应返回Task<T>;如果没有返回值,应返回Task。这写task相当于future,用于在异步方法结束时,通知主程序
async方法可以返回void,应该只限于在编写事件处理程序时。
async方法由多个同步执行的程序块组成。第一个同步块由调用该方法的线程执行。一般情况下,用await等待一个任务完成,当该任务在await出暂停,就可以捕获上下文,UI线程采用UI上下文,
处理ASP.NET才有ASP.NET上下文,其他情况采用线程池上下文。
因此,每一个同步快都会试图在原始的上下文中恢复运行。这样造成了极小的性能耗损,要避免恢复上下文,可以在await中使用 ConfigureAwait 方法,设置continueOnCapturedContext的值为false,
task任务完成后,将不会恢复前面的上下文。
最好的做法:在核心库里面一直使用ConfigureAwait 。在外面的用户界面代码中,只在需要时才恢复上下文。
异步编程的好处:
1、对应面向用户的GUI程序,异步编程提高了响应能力。
2、对于服务端程序,异步编程提供了扩展力。