是否有可能将SemaphoreSlim.WaitAsync()。ConfigureAwait(false)抛出?

时间:2017-03-30 12:55:18

标签: c# asynchronous deadlock

我刚刚在某些生产代码中看到了一个奇怪的行为,我似乎遇到了一些僵局。我想我已将其跟踪到以下代码

        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异常,但是我的日志记录没有报告任何异常。在我的客户取消之前,我一直挂着。

0 个答案:

没有答案