Хуже того, существуют условия, при которых он вообще не избавляется от официанта.Если вы позвоните OnCompleted
при waitingCount > 0
, флаг isCompleted
будет установлен на true
, но официант не будет удален.Когда что-то вызывает WaitForCompletion
, оно увидит, что isCompleted
равно true
, и немедленно выйдет.waiter.Dispose
никогда не вызывается.
Почему бы не использовать что-то вроде SpinLock , которое использует ту же логику, что и ManualResetEventSlim
?Если ваши ожидания, как правило, очень короткие, блокировка, вероятно, не будет оспорена, и это огромная победа.Если ожидание будет долгим, то ManualResetEventSlim
все равно заплатит цену перехода ядра.
Вы так уверены, что использование блокировки будет непомерно дорого?Есть «знание», а затем измерение.,.