DefaultBlockingAwaitAdapter
Useful when wrapping awaiters whose GetResult method does not block until complete.
Contains a default mechanism to implement BlockUntilCompleted
via IsCompleted and OnCompleted.
using System.Runtime.CompilerServices;
using System.Threading;
namespace NUnit.Framework.Internal
{
internal abstract class DefaultBlockingAwaitAdapter : AwaitAdapter
{
[System.Runtime.CompilerServices.Nullable(2)]
private volatile ManualResetEventSlim _completedEvent;
public sealed override void BlockUntilCompleted()
{
if (!IsCompleted) {
ManualResetEventSlim manualResetEventSlim = _completedEvent;
if (manualResetEventSlim == null) {
manualResetEventSlim = new ManualResetEventSlim();
ManualResetEventSlim manualResetEventSlim2 = Interlocked.CompareExchange(ref _completedEvent, manualResetEventSlim, null);
if (manualResetEventSlim2 == null)
OnCompleted(manualResetEventSlim.Set);
else {
manualResetEventSlim.Dispose();
manualResetEventSlim = manualResetEventSlim2;
}
}
manualResetEventSlim.Wait();
}
}
}
}