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

标签 c# .net-core async-await locking

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

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

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

  • 将异步数据库查询方法转换为同步,例如“Wait”或“.Result”。
  • 使用特殊的锁,例如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();
    

    关于c# - 在锁定中使用异步方法的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60282318/

    相关文章:

    c# - 自定义 Is64BitOperatingSystem 预处理器指令

    node.js - 尝试在 mocha 中使用 async/await

    c# - 下拉列表和数据阅读器

    c# - 从隐藏代码更改 UWP 按钮的可见性

    c# - 支持按分区键查询而无需更改接口(interface)的存储库

    javascript - 如何检查 Jest 中异步抛出的错误类型?

    javascript - 为什么异步函数中的setTimeout需要再次包装在新的Promise中?

    c# - 无法将类型 'System.Decimal' 的对象强制转换为类型 'System.String'

    c# - await 不会在原始上下文中恢复

    c# - Linux 上的 ClientWebSocket 抛出 AuthenticationException (SSL)