一个简单的类理解清楚 Async/Await

Posted Joseph zheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单的类理解清楚 Async/Await相关的知识,希望对你有一定的参考价值。

项目下,一个同事遇到一个问题,关于Async/Await使用时导致的,花了一点时间写了一个简单的类帮他理解async是否开启线程、是否同步执行。分享到这里。

可将此代码粘贴到linqpad中执行

 1 void Main()
 2 {
 3     ("主线程ID="+ Thread.CurrentThread.ManagedThreadId.ToString()).Dump();
 4     new MyClass();
 5 }
 6 
 7 public class MyClass  
 8 {  
 9    public MyClass()  
10    {  
11        DisplayValue(); //这里不会阻塞  
12        ("myclass 类 threadid="+ Thread.CurrentThread.ManagedThreadId.ToString()).Dump();
13    }  
14    public Task<double> GetValueAsync(double num1, double num2)  
15    {   
16           System.Threading.Thread.Sleep(3000);
17        return Task.Run(() =>  
18        {  
19            for (int i = 0; i < 1000000; i++)  
20            {  
21                num1 = num1 / num2;  
22            }  
23             ("GetValueAsync  线程ID="+ Thread.CurrentThread.ManagedThreadId.ToString()).Dump();
24            return num1;  
25        });  
26       
27    }  
28    public async void DisplayValue()  
29    {  
30         ("DisplayValue进入时的线程 threadid="+ Thread.CurrentThread.ManagedThreadId.ToString()).Dump();
31            double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回  
32         string.Format(" 计算结果 :[{0}]",result).Dump();
33 
34         ("DisplayValue结束时 threadid="+ Thread.CurrentThread.ManagedThreadId.ToString()).Dump();
35    }  
36 }

linqpad的执行结果如下

主线程ID=24
DisplayValue进入时的线程 threadid=24
myclass 类 threadid=24
GetValueAsync  线程ID=21
 计算结果 :[2.47032822920623E-322]
DisplayValue结束时 threadid=21

参考微软官方链接

以上是关于一个简单的类理解清楚 Async/Await的主要内容,如果未能解决你的问题,请参考以下文章

简单理解JavaScript 的async/await

理解异步函数async和await的用法

理解koa2 之 async + await + promise

Koa异步处理Async Await和Promise 的使用

async/await 原理及简单实现

进阶篇:以IL为剑,直指async/await