#if NET_4_5
+using System.Threading;
using System.Threading.Tasks;
+using System.Runtime.ExceptionServices;
namespace System.Runtime.CompilerServices
{
public struct ConfiguredTaskAwaitable<TResult>
{
- public struct ConfiguredTaskAwaiter
+ public struct ConfiguredTaskAwaiter : ICriticalNotifyCompletion
{
readonly Task<TResult> task;
readonly bool continueOnSourceContext;
public TResult GetResult ()
{
+ if (!task.IsCompleted)
+ task.WaitCore (Timeout.Infinite, CancellationToken.None, true);
+
if (task.Status != TaskStatus.RanToCompletion)
- throw TaskAwaiter.HandleUnexpectedTaskResult (task);
+ ExceptionDispatchInfo.Capture (TaskAwaiter.HandleUnexpectedTaskResult (task)).Throw ();
return task.Result;
}
if (continuation == null)
throw new ArgumentNullException ("continuation");
- TaskAwaiter.HandleOnCompleted (task, continuation, continueOnSourceContext);
+ TaskAwaiter.HandleOnCompleted (task, continuation, continueOnSourceContext, true);
+ }
+
+ public void UnsafeOnCompleted (Action continuation)
+ {
+ if (continuation == null)
+ throw new ArgumentNullException ("continuation");
+
+ TaskAwaiter.HandleOnCompleted (task, continuation, continueOnSourceContext, false);
}
}