对C# .Net4.5异步机制测试

     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之后的代码交付异步线程运行的效果

posted @ 2018-03-15 19:20  _离水的鱼  阅读(319)  评论(1编辑  收藏  举报