<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.0-rc1" />

ConfiguredValueTaskAwaitable

using System.Diagnostics; using System.Runtime.InteropServices; using System.Threading.Tasks; using System.Threading.Tasks.Sources; namespace System.Runtime.CompilerServices { [StructLayout(LayoutKind.Auto)] public readonly struct ConfiguredValueTaskAwaitable { [StructLayout(LayoutKind.Auto)] public readonly struct ConfiguredValueTaskAwaiter : ICriticalNotifyCompletion, INotifyCompletion { private readonly ValueTask _value; public bool IsCompleted { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return _value.IsCompleted; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ConfiguredValueTaskAwaiter(ValueTask value) { _value = value; } [MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Diagnostics.StackTraceHidden] public void GetResult() { _value.ThrowIfCompletedUnsuccessfully(); } public void OnCompleted(Action continuation) { object obj = _value._obj; Task task; ConfiguredTaskAwaitable configuredTaskAwaitable; ConfiguredTaskAwaitable.ConfiguredTaskAwaiter awaiter; if ((task = (obj as Task)) != null) { configuredTaskAwaitable = task.ConfigureAwait(_value._continueOnCapturedContext); awaiter = configuredTaskAwaitable.GetAwaiter(); awaiter.OnCompleted(continuation); } else if (obj != null) { Unsafe.As<IValueTaskSource>(obj).OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token, (ValueTaskSourceOnCompletedFlags)(2 | (_value._continueOnCapturedContext ? 1 : 0))); } else { configuredTaskAwaitable = ValueTask.CompletedTask.ConfigureAwait(_value._continueOnCapturedContext); awaiter = configuredTaskAwaitable.GetAwaiter(); awaiter.OnCompleted(continuation); } } public void UnsafeOnCompleted(Action continuation) { object obj = _value._obj; Task task; ConfiguredTaskAwaitable configuredTaskAwaitable; ConfiguredTaskAwaitable.ConfiguredTaskAwaiter awaiter; if ((task = (obj as Task)) != null) { configuredTaskAwaitable = task.ConfigureAwait(_value._continueOnCapturedContext); awaiter = configuredTaskAwaitable.GetAwaiter(); awaiter.UnsafeOnCompleted(continuation); } else if (obj != null) { Unsafe.As<IValueTaskSource>(obj).OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token, _value._continueOnCapturedContext ? ValueTaskSourceOnCompletedFlags.UseSchedulingContext : ValueTaskSourceOnCompletedFlags.None); } else { configuredTaskAwaitable = ValueTask.CompletedTask.ConfigureAwait(_value._continueOnCapturedContext); awaiter = configuredTaskAwaitable.GetAwaiter(); awaiter.UnsafeOnCompleted(continuation); } } } private readonly ValueTask _value; [MethodImpl(MethodImplOptions.AggressiveInlining)] internal ConfiguredValueTaskAwaitable(ValueTask value) { _value = value; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public ConfiguredValueTaskAwaiter GetAwaiter() { return new ConfiguredValueTaskAwaiter(_value); } } }