internal static void HandleOnCompleted(Task task, Action continuation, bool continueOnSourceContext, bool manageContext) { if (continueOnSourceContext && SynchronizationContext.Current != null && SynchronizationContext.Current.GetType() != typeof(SynchronizationContext)) { task.ContinueWith(new SynchronizationContextContinuation(continuation, SynchronizationContext.Current)); } else { IContinuation cont; Task cont_task; if (continueOnSourceContext && !TaskScheduler.IsDefault) { cont_task = new Task(TaskActionInvoker.Create(continuation), null, CancellationToken.None, TaskCreationOptions.None, null); cont_task.SetupScheduler(TaskScheduler.Current); cont = new SchedulerAwaitContinuation(cont_task); } else { cont_task = null; cont = new AwaiterActionContinuation(continuation); } // // This is awaiter continuation. For finished tasks we get false result and need to // queue the continuation otherwise the task would block // if (task.ContinueWith(cont, false)) { return; } if (cont_task == null) { cont_task = new Task(TaskActionInvoker.Create(continuation), null, CancellationToken.None, TaskCreationOptions.None, null); cont_task.SetupScheduler(TaskScheduler.Current); } cont_task.Schedule(true); } }
internal static void HandleOnCompleted(Task task, Action continuation, bool continueOnSourceContext, bool manageContext) { if (continueOnSourceContext && SynchronizationContext.Current != null && SynchronizationContext.Current.GetType () != typeof (SynchronizationContext)) { task.ContinueWith (new SynchronizationContextContinuation (continuation, SynchronizationContext.Current)); } else { IContinuation cont; Task cont_task; if (continueOnSourceContext && !TaskScheduler.IsDefault) { cont_task = new Task (TaskActionInvoker.Create (continuation), null, CancellationToken.None, TaskCreationOptions.None, null); cont_task.SetupScheduler (TaskScheduler.Current); cont = new SchedulerAwaitContinuation (cont_task); } else { cont_task = null; cont = new AwaiterActionContinuation (continuation); } // // This is awaiter continuation. For finished tasks we get false result and need to // queue the continuation otherwise the task would block // if (task.ContinueWith (cont, false)) return; if (cont_task == null) { cont_task = new Task (TaskActionInvoker.Create (continuation), null, CancellationToken.None, TaskCreationOptions.None, null); cont_task.SetupScheduler (TaskScheduler.Current); } cont_task.Schedule (true); } }