zoukankan      html  css  js  c++  java
  • 对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可怕
  • 相关阅读:
    SQL Server 查看物理页存储
    Sql Server 孤立用户解决办法
    大文件下载
    UITableViewCell
    xib文件的使用
    UIToolbar
    UIView常见的属性和方法
    iOS的三种多线程技术:
    网络处理文件上传、获取文件MIMEType、其他HTTP请求方式
    转场动画过渡效果
  • 原文地址:https://www.cnblogs.com/Jacket-K/p/8575644.html
Copyright © 2011-2022 走看看