C#中的Async和Await关键字是异步编程的核心。使用这两个关键字可以轻松创建异步方法。使用async关键字定义的异步方法简称“异步方法”。
异步编程并发的一种形式,它采用furture模式或回调(callback)机制,以避免产生不必要的线程。.Net中future的类型有Task和TaskResult。
异步编程的核心理念是异步操作:
启动了的操作将会在一段时间后完成。
这个操作正在执行时,但不会阻塞原来的线程。
启动了这个操作的线程后,可以继续执行其它任务。
当操作完成时,它会通知它的future,或者调用回调函数,以便让程序知道操作已经结束。
异步的好处对于面向终端用户的GUI程序,异步可以提高响应能力。
对于服务器应用:异步编程实现了可扩展。
服务器可以利用线程池填满其可扩展性,使用异步编程后,可扩展性通常可以提供一个数量级,可以最大程度的压榨服务器性能,提高处理能力。
async使用async修饰符可以将方法、lambda表达式或匿名方法指定为异步。
async的主要目的是,使方法内的await关键字生效。
//等待异步完成再执行后边的操作,但是整个方法不会阻塞varresult=awaitDoSomethingAsync();output.Result=result;
如果使用了Async最好一直使用它
awaitasync标记的异步方法,可以使用await来指定暂定点。await运算符通知编译器异步方法:在等待的异步过程完成后才能继续通过该点。同时,会将控制权返回至异步方法的调用方。
async方法在开始时以同步的方式执行。在async方法内部,await关键字对他的参数(一个异步任务)执行一个异步等待。它首先检查操作是否已经完成,如果完成了,就继续运行(同步方法)。否则,他会暂停async方法,并返回,将控制权交给调用方,留下一个未完成的Task。一段时间后,操作完成,async方法再恢复运行。
用await语句等待一个任务完成,当该方法在await处暂停时,就可以捕捉上下文(context)。如果当前SynchronizationContext不为空,这个上下文就是当前SynchronizationContext。如果当前SynchronizationContext为空,则这个上下文为当前TaskScheduler。该方法会在这个上下文中继续运行。
//此时await会捕获当前上下文awaitDoSomethingAsync();//....//这里会试图用上边捕获的上下文继续执行
awaitDoSomethingAsync().ConfigureAwait(false);//....这里开始在新的线程中运行
ConfigureAwait配置Task的awaiter,将延续任务封装回原始上下文,则为True,否则为False。
详情可查阅ConfigureAwait(false)资料,这里暂时不做赘述。可阅读以下文章
原文ConfigureAwaitFAQ