ValueTaskAwaiter<TResult>
using System.Diagnostics;
using System.Threading.Tasks;
using System.Threading.Tasks.Sources;
namespace System.Runtime.CompilerServices
{
public readonly struct ValueTaskAwaiter<TResult> : ICriticalNotifyCompletion, INotifyCompletion
{
private readonly ValueTask<TResult> _value;
public bool IsCompleted {
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get {
return _value.IsCompleted;
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal ValueTaskAwaiter(ValueTask<TResult> value)
{
_value = value;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[System.Diagnostics.StackTraceHidden]
public TResult GetResult()
{
return _value.Result;
}
public void OnCompleted(Action continuation)
{
object obj = _value._obj;
Task<TResult> task;
if ((task = (obj as Task<TResult>)) != null)
task.GetAwaiter().OnCompleted(continuation);
else if (obj != null) {
Unsafe.As<IValueTaskSource<TResult>>(obj).OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token, ValueTaskSourceOnCompletedFlags.UseSchedulingContext | ValueTaskSourceOnCompletedFlags.FlowExecutionContext);
} else {
ValueTask.CompletedTask.GetAwaiter().OnCompleted(continuation);
}
}
public void UnsafeOnCompleted(Action continuation)
{
object obj = _value._obj;
Task<TResult> task;
if ((task = (obj as Task<TResult>)) != null)
task.GetAwaiter().UnsafeOnCompleted(continuation);
else if (obj != null) {
Unsafe.As<IValueTaskSource<TResult>>(obj).OnCompleted(ValueTaskAwaiter.s_invokeActionDelegate, continuation, _value._token, ValueTaskSourceOnCompletedFlags.UseSchedulingContext);
} else {
ValueTask.CompletedTask.GetAwaiter().UnsafeOnCompleted(continuation);
}
}
}
}