コード例 #1
0
ファイル: TaskAwaiter.cs プロジェクト: pmq20/mono_forked
        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);
            }
        }
コード例 #2
0
        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);
            }
        }