从最近几天开始,我面对下面的代码段的间歇性死锁,仅当我们使用异步调用时发生,我的Api调用挂起了无限的时间,最糟糕的是我无法重现它在我的本地计算机上,它来自UAT和生产环境(在IIS重置后工作正常)。
此外,我们在WebAPI Project中使用此方法,并且该类已注册为WebPerRequest。
static SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
static ConcurrentDictionary<string, List<Employee>> _data;
/// Intermittent Deadlock after some time
private async Task<ConcurrentDictionary<string, List<Employee>>> GetEmployees()
{
await semaphore.WaitAsync();
try
{
if (_data == null)
{
// async db call
}
}
finally
{
semaphore.Release();
}
return _data ;
}
// Working Fine
private async Task<ConcurrentDictionary<string, List<Employee>>> GetEmployees()
{
await semaphore.WaitAsync();
try
{
if (_data == null)
{
// sync db call
}
}
finally
{
semaphore.Release();
}
return _data ;
}