在 C# 中将锁转换为异步
Posted
技术标签:
【中文标题】在 C# 中将锁转换为异步【英文标题】:Convert lock to async in C# 【发布时间】:2014-09-26 09:16:30 【问题描述】:如何将此单例方法转换为与async
等效的方法?我正在尝试写这样的东西:public static async Task<DbContext> DBContext
。
public class ModelDB
static DbContext _dbContext;
readonly static object obj = new object();
public static DbContext DBContext
get
lock (obj)
if (_dbContext == null)
_dbContext = new MoviesDBEntities();
return _dbContext;
【问题讨论】:
eee、lock
和 async
是完全不同的概念:异步和并行编程。
您没有任何异步工作要做。此外,静态 DbContext 通常是个坏主意。
请注意,无论如何您都不能同时使用 EF 上下文。考虑到这一点,这个问题可能没有实际意义。
@usr。你能解释一下为什么我不能同时使用 EF 上下文吗?
@Zinov:DbContexts 不能同时使用,并且在活动时保持 DB 连接。您应该在本地创建它们并尽快处理它们。
【参考方案1】:
即使在 async
方法中,您仍然可以(并且可能应该)使用同步 lock
,除非您希望 lock
比平时保持更长时间(我猜 new MoviesDBEntities();
不应该真的花更多时间几毫秒)。
当您确实需要异步锁定时,您可以使用 SemaphoreSlim
设置为 1 并调用 WaitAsync
进行异步等待,如下所示:
await _semphore.WaitAsync()
try
... use shared resource.
finally
_semphore.Release()
Here's 一个实现示例。
【讨论】:
@Zinov 在将近 3 年后?你不觉得你应该问一个新的吗? 解决问题而不是带来更多细节,那时我已经得到了答案以上是关于在 C# 中将锁转换为异步的主要内容,如果未能解决你的问题,请参考以下文章