我刚刚在某些生产代码中看到了一个奇怪的行为,我似乎遇到了一些僵局。我想我已将其跟踪到以下代码
await _registerLock.WaitAsync(_cts.Token).ConfigureAwait(false);
try
{
using (var tx = StateManager.CreateTransaction())
{
response = await CreateRegistrationAsync(registration, tx).ConfigureAwait(false);
await tx.CommitAsync().ConfigureAwait(false);
}
}
finally
{
_registerLock.Release();
}
我的想法是WaitAsync导致输入信号量,但之后抛出异常,这意味着从未调用过该版本。这意味着后续尝试进入块等待释放将永远不会发生。
我发现有些人在try之外用WaitAsync编写代码,而其他人在try中使用WaitAsync编写代码。
当然可能会抛出一个ObjectDisposed异常,但是我的日志记录没有报告任何异常。在我的客户取消之前,我一直挂着。