一个简单的类理解清楚 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的主要内容,如果未能解决你的问题,请参考以下文章
理解koa2 之 async + await + promise