Merge branch 'master' into msbuilddll2
[mono.git] / mcs / class / corlib / System.Runtime.CompilerServices / ConfiguredTaskAwaitable_T.cs
index 5621857a4976b9c567369a29fc8389495f412489..b96b1cc6f377fcf8804ef705575310231959facb 100644 (file)
 
 #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;
@@ -53,8 +55,11 @@ namespace System.Runtime.CompilerServices
 
                        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;
                        }
@@ -64,7 +69,15 @@ namespace System.Runtime.CompilerServices
                                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);
                        }
                }