繁体   English   中英

在锁定中使用异步方法的最佳实践是什么

[英]what is the best practice using async method in lock

在 .Net Core 中,许多 I/O 方法都有异步版本,Microsoft 建议我们使用它们以获得更好的性能。

但是我们知道,异步方法不能在普通锁中正常工作,因为普通锁是相对于线程的。

例如,在 MemoryCache 中使用 ReadWriteLocker。当 MemoryCache 丢失时,我需要从数据库读取数据。 我现在知道两种方法来解决这个问题:

  1. 将异步数据库查询方法转换为同步,例如“Wait”或“.Result”。
  2. 使用特殊的锁,例如redis锁或一些非官方的AsyncReaderWriteLocker。(我找到了一个,但我还没有读过它的代码,所以我不知道它的细节,成本或新错误)

回到标题,当我必须在锁定中使用异步方法时,最好的方法是什么?我需要一些建议。 非常感谢您阅读我糟糕的英语。

lock只是信号量的语法糖。 你可以用SemaphoreSlim做你需要的,像这样。 首先在需要线程保护的任何地方都可以访问的字段或属性中声明一个信号量:

public readonly SemaphoreSlim _mySemaphoreSlim = new SemaphoreSlim(1, 1);

然后像这样使用它:

await _mySemaphoreSlim.WaitAsync(cancellationToken);
// Do whatever other sync or async operations you need.
_initializationSemaphoreSlim.Release();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM