异步(async 和await)
异步编程
并发的一种形式,它采用 future 模式或回调(callback)机制,以避免产生不必要的线程。
一个 future(或 promise)类型代表一些即将完成的操作。在 .NET 中,新版 future 类型
有 Task 和 Task 。在老式异步编程 API 中,采用回调或事件(event),而不是
future。异步编程的核心理念是异步操作:启动了的操作将会在一段时间后完成。这个操作
正在执行时,不会阻塞原来的线程。启动了这个操作的线程,可以继续执行其他任务。当
操作完成时,会通知它的future,或者调用回调函数,以便让程序知道操作已经结束。
异步操作是.net4.5推出的新名词,事实上,这东西早就有了,它归根结底是通过线程池来实现的,即将一个大任务分成多个小任何块,每个线程并行处理其中的一个,完成后再把结果告诉主线程,在.net4.5推出后,这种技术得到了封装,让开发人员实现起来更加方便了,但是,并发(异步,多线程)并不是在哪里都适用的,使用不当,可能出现很多严重的后果!
使用异步编程,方法调用是在后台执行(通常在线程的帮助下),并且不会阻塞调用线程。
await 关键字会解除线程(这里是UI线程)的阻塞,完成其他任务。当其方法完成其后台处理后,UI线程就可以继续,从后台线程中获得结果。
async 关键字创建了一个状态机,类似yieId return语句。
async修饰符只能用于返回Task或void的方法。
- async 标识一个方法为异步方法,可以与主线程并行执行,发挥CPU的多核优势
- await 在调用一个async方法前可以添加这个修饰符,它意思是等待当前异步方法执行完后,再执行下面的代码
代码:
class Program
{
static void Main(string[] args)
{
//当前线程(因为词句代码放在哪个线程代码模块下执行就表示哪个线程进行休眠)开始休眠指定的时间。
Console.WriteLine("Main currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
DoSomething();
Console.WriteLine("Main currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
Console.ReadKey(true);
}
/// <summary>
/// 代码实现中如果是异步,那么此方法名就需要(标记)成异步方法,即加上:aysnc修饰词
/// </summary>
private async static void DoSomething()
{
//耗时操作有:IO/Web跳转等操作。
Console.WriteLine("耗时操作开始 currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
//使用await关键字,在Task.Run方法完成前,当前方法内的其他代码不会继续执行,但是,启动DoSomething方法的线程可以被重新,该线程没有被阻塞。
await Task.Run(() =>
{
Console.WriteLine("延迟3秒进行中 currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(3000);
});//委托方法
Console.WriteLine("耗时操作结束 currentThreadID为:" + Thread.CurrentThread.ManagedThreadId);
}
}
结果图: