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