为什么async/await方法不能有lock或Monitor

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么async/await方法不能有lock或Monitor相关的知识,希望对你有一定的参考价值。

        相信有不少朋友知道async/await有lock语法的情况一般都会编译错误,这个时候可以通过Monitor来解决编译错误的问题;虽然这样解决的编译错误但本质问题还是没有解决。

        其实并不是async/await方法不能用lock或Monitor,而是在lock或Monitor的作用域内是不能使用awaiter功能。最主要原因是await后面代码执行线程非常大的机率不是Monitor.Enter线程,所以在执行Monitor.Exit的是会异常的。lock或Monitor要求锁和解锁对象时都必须是同一线程处理,而await其实只是个异步状态机,它后面的代码触发线程是异常步回调线程,所以是无法释放对象锁的。

        但有时候个别async/await需要同步执行怎办?那可以使用线程信号量来解决。通过SemaphoreSlim对象可以方便解决方法同步运行问题,详细可查看

https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.semaphoreslim?view=net-5.0

BeetleX

开源跨平台通讯框架(支持TLS)
提供高性能服务和大数据处理解决方案

https://beetlex.io

以上是关于为什么async/await方法不能有lock或Monitor的主要内容,如果未能解决你的问题,请参考以下文章

async await 异步下载 异步代码 加锁 lock 异步缓存

[转] Async/Await替代Promise的6个理由

promise与async和await的区别

promise,async await,try catch的问题整理

为啥 try .. catch() 不能与 async/await 函数一起使用?

Nodejs 承诺 async/await 不能正常工作