【发布时间】:2020-02-18 21:51:57
【问题描述】:
在 .Net Core 中,许多 I/O 方法都有异步版本,微软建议我们使用它们以获得更好的性能。
但是我们知道,异步方法不能在普通锁中正常工作,因为普通锁是相对于线程而言的。
例如,在 MemoryCache 中使用 ReadWriteLocker。当 MemoryCache 缺失时,我需要从数据库中读取数据。 我现在知道解决这个问题的两种方法:
- 将异步数据库查询方法转换为同步,例如“Wait”或“.Result”。
- 使用特殊的锁,比如redis锁或者一些非官方的AsyncReaderWriteLocker。(我找到了一个,但是我还没有阅读它的代码,所以我不知道它的细节,成本或新的bug)
回到标题,当我必须在锁定中使用异步方法时,最好的方法是什么?我需要一些建议。 非常感谢您阅读我蹩脚的英语。
【问题讨论】:
-
你可以使用SemaphoreSlim,它有一个WaitAsync方法
-
我知道如何使用 SemaphoreSlim 代替简单的锁,但是代替 ReadWriteLocker 很难。
-
是的,不幸的是没有内置的异步读/写锁。
-
我们一直在使用来自Stephen Cleary's
AsyncExlibrary 的AsyncReaderWriterLock并取得了巨大的成功。 -
谢谢你的回答,我会阅读AsyncReaderWriteLocker的代码。但是不知道有没有更好的方法来解决这个问题。
标签: c# .net-core async-await locking