为什么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 异步缓存
promise,async await,try catch的问题整理