<PackageReference Include="NUnit" Version="4.2.2" />

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(); } } } }