static void Main(string[] args) { Test(); // 这个方法其实是多余的, 本来可以直接写下面的方法 // await GetName() // 但是由于控制台的入口方法不支持async,所有我们在入口方法里面不能 用 await Console.WriteLine("Current2 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId); Console.ReadKey(); } static async Task Test() { // 方法打上async关键字,就可以用await调用同样打上async的方法 // await 后面的方法将在另外一个线程中执行 await GetName(); } static async Task GetName() { // Delay 方法来自于.net 4.5 Console.WriteLine("Current Thread Id :{0}", Thread.CurrentThread.ManagedThreadId); //await Task.Delay(1000); // 返回值前面加 async 之后,方法里面就可以用await了 var a= Task<string>.Run(() => { Console.WriteLine("Current3 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(1000); return "abc"; }); Console.WriteLine("Current5 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId); var b = Task<string>.Run(() => { Console.WriteLine("Current4 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); return "abc"; }); await a; Console.WriteLine("Current6 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId); await b; Console.WriteLine("Current1 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId); Console.WriteLine("In antoher thread....."); }
发现一旦await等待的结果没有还未返回,await后续的代码就会被扔给所等待的线程执行
根据测试,async函数内遇到await且所等待的Task未返回应该采用的不是返回机制,而是直接从栈上跳出整个函数了,并把后续代码扔给了所等待Task线程操作。
这是怎么实现的呢?
根据我写C的经验单纯写C来实现这一套机制好像不现实了。应该是汇编操作地址了。
如果对这个机制基本使用不了解的,可以看这文章了解或者回顾下
async & await 的前世今生(Updated)
最近使用C++ std::async发现于此不同。std::async返回std::future。在future对象消亡前必然会强制保证Task执行完毕,类似于自动调用了future.wait() or get()。而且没有C#的将await之后的代码交付异步线程运行的效果