我正在从 dotnet 核心 Web 应用程序访问EventStore 。所有线程共享一个连接。连接在第一次访问时打开,我需要确保只有一个线程打开连接。以前我会使用 alock
但后来我无法await
打开连接。
我发现下面的代码片段看起来应该可以解决问题:
public class AsyncLock : IDisposable
{
private readonly SemaphoreSlim _semaphoreSlim = new SemaphoreSlim(1, 1);
public async Task<AsyncLock> LockAsync()
{
await _semaphoreSlim.WaitAsync().ConfigureAwait(false);
return this;
}
public void Dispose()
{
_semaphoreSlim.Release();
}
}
并在我的代码中使用它:
private static readonly AsyncLock _mutex = new AsyncLock();
private volatile bool _isConnected = false;
private async Task EstablishConnected()
{
if (!_isConnected)
{
using (await _mutex.LockAsync())
{
if (!_isConnected)
{
await _connection.ConnectAsync().ConfigureAwait(false);
_isConnected = true;
}
}
}
}
这是同步访问以初始化/打开与 EventStore 的连接的合理方法吗?