【发布时间】:2018-02-08 19:54:12
【问题描述】:
我正在从 dotnet 核心 Web 应用程序访问 EventStore。所有线程共享一个连接。连接在第一次访问时打开,我需要确保只有一个线程打开连接。以前我会使用lock,但后来我不能await 方法打开连接。
我发现 following snippet 的代码看起来应该可以解决问题:
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 的连接的合理方法吗?
【问题讨论】:
-
我发现 Stephen Cleary 的 AsyncEx 库 github.com/StephenCleary/AsyncEx 是一个替代品。
标签: c# .net multithreading .net-core eventstoredb