详细资料
lamda 变成异步方法 ,只要在前面 加 async 修饰 即可
》》await 修饰的 ,await 所在的方法,必须修饰 async
ThreadPool.QueueUserWorkItem( async (obj)=>{
while(true)
{
await File.WriteAllTextAsync("路径","要写入的内容");
}
})
如果无法用 await 修饰的异步方法, 但有死锁的风险
》》需要分2步
1》
Task t = File.ReadAllTextAsync(“路径”)
2》
string s = t.Result;
或者
string s = Task t = File.ReadAllTextAsync(“路径”).await();
》》》结论
await 调用的等待期间,.Net会把 当前的线程返回给线程池,等异步方法调用执行完毕后框架会从线程池再取出来一个线程执行后续的代码。所以await 前后可能不是同一个线程。如果await 时间越长,大概率不是一个线程,如果时间较短,大概率是同一个线程。线程切换会浪费资源的。
Async 异步方法 并不会自动在新线程中执行, 除非 手动 放到新线程中,常用 Task.Run()
》》》 手动放入线程中。
》》》》结论
异步方法 不等于 多线程
异步方法的代码并不会自动在新线程中执行,除非把代码放到新线程中执行。
没用async 的 异步方法 ,运行效率更高,不会造成线程浪费
》》》 async 修饰的方法 会被编译器 生成一个类,所以运行效率没有普通的方法高
》》》如果一个异步方法只是对别的异步方法调用的转发,并没有太多复杂的逻辑(比如等待A结果,再调用B;把A调用的返回值作为B使用。)那就可以去掉 async 关键字。