diff options
Diffstat (limited to 'src/System.Private.CoreLib/shared/System/Runtime')
2 files changed, 26 insertions, 2 deletions
diff --git a/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/ConfiguredValueTaskAwaitable.cs b/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/ConfiguredValueTaskAwaitable.cs index 071911813..fa3e7c06c 100644 --- a/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/ConfiguredValueTaskAwaitable.cs +++ b/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/ConfiguredValueTaskAwaitable.cs @@ -35,7 +35,7 @@ namespace System.Runtime.CompilerServices /// <summary>Provides an awaiter for a <see cref="ConfiguredValueTaskAwaitable{TResult}"/>.</summary> [StructLayout(LayoutKind.Auto)] - public struct ConfiguredValueTaskAwaiter : ICriticalNotifyCompletion + public struct ConfiguredValueTaskAwaiter : ICriticalNotifyCompletion, IConfiguredValueTaskAwaiter { /// <summary>The value being awaited.</summary> private ValueTask<TResult> _value; // Methods are called on this; avoid making it readonly so as to avoid unnecessary copies @@ -71,6 +71,18 @@ namespace System.Runtime.CompilerServices /// <summary>Gets the task underlying <see cref="_value"/>.</summary> internal Task<TResult> AsTask() => _value.AsTask(); + + /// <summary>Gets the task underlying the incomplete <see cref="_value"/>.</summary> + /// <remarks>This method is used when awaiting and IsCompleted returned false; thus we expect the value task to be wrapping a non-null task.</remarks> + (Task, bool) IConfiguredValueTaskAwaiter.GetTask() => (_value.AsTaskExpectNonNull(), _continueOnCapturedContext); } } + + /// <summary> + /// Internal interface used to enable extract the Task from arbitrary configured ValueTask awaiters. + /// </summary> + internal interface IConfiguredValueTaskAwaiter + { + (Task task, bool continueOnCapturedContext) GetTask(); + } } diff --git a/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/ValueTaskAwaiter.cs b/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/ValueTaskAwaiter.cs index 203039a4a..0b0ed8595 100644 --- a/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/ValueTaskAwaiter.cs +++ b/src/System.Private.CoreLib/shared/System/Runtime/CompilerServices/ValueTaskAwaiter.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace System.Runtime.CompilerServices { /// <summary>Provides an awaiter for a <see cref="ValueTask{TResult}"/>.</summary> - public struct ValueTaskAwaiter<TResult> : ICriticalNotifyCompletion + public struct ValueTaskAwaiter<TResult> : ICriticalNotifyCompletion, IValueTaskAwaiter { /// <summary>The value being awaited.</summary> private ValueTask<TResult> _value; // Methods are called on this; avoid making it readonly so as to avoid unnecessary copies @@ -38,5 +38,17 @@ namespace System.Runtime.CompilerServices /// <summary>Gets the task underlying <see cref="_value"/>.</summary> internal Task<TResult> AsTask() => _value.AsTask(); + + /// <summary>Gets the task underlying the incomplete <see cref="_value"/>.</summary> + /// <remarks>This method is used when awaiting and IsCompleted returned false; thus we expect the value task to be wrapping a non-null task.</remarks> + Task IValueTaskAwaiter.GetTask() => _value.AsTaskExpectNonNull(); + } + + /// <summary> + /// Internal interface used to enable extract the Task from arbitrary ValueTask awaiters. + /// </summary>> + internal interface IValueTaskAwaiter + { + Task GetTask(); } } |