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

    少壮不识cpp,老大方知cpp可怕
  • 相关阅读:
    数据分析面试题
    二、初始化superset
    一、下载安装superset
    leaflet如何加载10万数据
    leaflet中如何优雅的解决百度、高德地图的偏移问题
    oracle 获取数据库时间
    dev中gridcontrol中改变符合某一条件的行的背景色
    dev中动态初始化菜单栏
    oracle向数据库中插入时间数据
    Silverlight中全屏处理
  • 原文地址:https://www.cnblogs.com/Jacket-K/p/8575644.html
Copyright © 2020-2023  润新知