在 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、lockasync 是完全不同的概念:异步和并行编程。 您没有任何异步工作要做。此外,静态 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# 中将锁转换为异步的主要内容,如果未能解决你的问题,请参考以下文章

将图像异步转换为 Base64 的 C# 简单应用程序

异步在 C# 中如何工作?

关于C#异步编程的建议

C#基础(二十):异步编程

c# 异步 curl 请求 - 我如何访问响应?

c#中的Task异步编程