c# - 在锁定中使用异步方法的最佳实践是什么
问题描述
在 .Net Core 中,许多 I/O 方法都有异步版本,微软建议我们使用它们以获得更好的性能。
但是我们知道,异步方法不能在普通锁中正常工作,因为普通锁是相对于线程而言的。
例如,在 MemoryCache 中使用 ReadWriteLocker。当 MemoryCache 丢失时,我需要从数据库中读取数据。我现在知道解决这个问题的两种方法:
- 将异步数据库查询方法转换为同步,例如“Wait”或“.Result”。
- 使用特殊锁,如redis锁或一些非官方的AsyncReaderWriteLocker。(我找到了一个,但我还没有阅读它的代码,所以我不知道它的细节,成本或新的bug)
回到标题,当我必须在锁定中使用异步方法时,最好的方法是什么?我需要一些建议。非常感谢您阅读我蹩脚的英语。
解决方案
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();
推荐阅读
- android - VideoView Android上的黑色背景
- pandas - 在带有线图的 seaborn FacetGrid 中使用单位
- r - 根据 DAG 中的顶点名称获取“顶级”边
- debugging - 将进程输出路由到 windbg
- perl - 如何将 Net::DNS::RR:TSIG 与 ddns-confgen 生成的密钥文件一起使用?
- at-command - AT+CUSD=1,"*101#" 不能与两个差异运算符一起使用
- ios - 着色器程序在 Cocos2d 2.2 Obj.C iOS 12 中不起作用
- c# - 使用命令提示符删除下载文件夹中的特定文件
- sql-server - 为什么两列之间的`+`不会产生错误
- ios - 如何将类型擦除与使用关联类型的协议一起使用