对于 《C# 彻底搞懂async/await》 一文中的观点,提出自己的修正观点。
刚接触C#搜到这篇文章,受益颇多感谢原作者,但有总结出一些不同的观点。
原文链接:《C# 彻底搞懂async/await》
目前从我自己的实验得出的结论是,这篇文章中的一些总结是错误的。
1.文章中说从 await 开始就分为2个线程执行了,这是错误的,看后面代码输出就知道了。
2.文章中说死锁的问题也是错误的,愿文章中有位读者已经回复了这个问题:“死锁不是因为await/async,而是因为ui context(winform项目)和request context(web项目),这两个上下文 SynchronizationContext.Current一次只能一个线程访问。如果换成控制台项目( SynchronizationContext.Current为null),那样写法就不会死锁。”
下面贴上我的实验代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; namespace Test.Main { class Program { static void Main(string[] args) { Console.WriteLine("Main Thread ID:" + Thread.CurrentThread.ManagedThreadId); Test ts = new Test(); ts.DoTest(); Console.ReadKey(); } } public class Test { public void DoTest() { Console.WriteLine("111 Thread ID:" + Thread.CurrentThread.ManagedThreadId); var res = AsyncMethod(); Console.WriteLine(res.Result); Console.WriteLine("222 Thread ID:" + Thread.CurrentThread.ManagedThreadId); } private async Task<string> AsyncMethod() { Console.WriteLine("AsyncMethod Thread ID:" + Thread.CurrentThread.ManagedThreadId); var ResultFromTimeConsumingMethod = TimeConsumingMethod(); string Result = await ResultFromTimeConsumingMethod + " Thread ID is :" + Thread.CurrentThread.ManagedThreadId; Console.WriteLine(Result); //返回值是Task的函数可以不用return Result += " -------------->"; return Result; } //这个函数就是一个耗时函数,可能是IO操作,也可能是cpu密集型工作。 private Task<string> TimeConsumingMethod() { Console.WriteLine("TimeConsumingMethod Thread ID:" + Thread.CurrentThread.ManagedThreadId); var task = Task.Run(() => { Console.WriteLine("Before Sleep Thread ID:" + Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); Console.WriteLine("After Sleep Thread ID :" + Thread.CurrentThread.ManagedThreadId); return "Finished"; }); return task; } } }
再看输出结果:

我的结论:
1. async、await 这两个关键字主要是用来配对使用的,比如一个函数内想用 await 来阻塞等待函数执行返回,这个调用的函数就要用 async 来修饰,目前看只有这个作用。
2.实际上生成线程是这句调用: Task.Run() ,看我的测试代码,直到这句之前,所有的代码都是在主线程中执行的。
本人接触C#不久,用C++多一些,所以都是用C++的调试方法总结的,肯定有不妥之处,望各位C#朋友指教。
浙公网安备 33010602011771号