示例#1
0
        internal override void Run(Task completedTask, bool bCanInlineContinuationTask)
        {
            TaskContinuationOptions continuationOptions = this.m_options;
            int  num  = completedTask.IsRanToCompletion ? ((continuationOptions & TaskContinuationOptions.NotOnRanToCompletion) == TaskContinuationOptions.None ? 1 : 0) : (completedTask.IsCanceled ? ((continuationOptions & TaskContinuationOptions.NotOnCanceled) == TaskContinuationOptions.None ? 1 : 0) : ((continuationOptions & TaskContinuationOptions.NotOnFaulted) == TaskContinuationOptions.None ? 1 : 0));
            Task task = this.m_task;

            if (num != 0)
            {
                if (!task.IsCanceled && AsyncCausalityTracer.LoggingOn)
                {
                    AsyncCausalityTracer.TraceOperationRelation(CausalityTraceLevel.Important, task.Id, CausalityRelation.AssignDelegate);
                }
                task.m_taskScheduler = this.m_taskScheduler;
                if (bCanInlineContinuationTask && (continuationOptions & TaskContinuationOptions.ExecuteSynchronously) != TaskContinuationOptions.None)
                {
                    TaskContinuation.InlineIfPossibleOrElseQueue(task, true);
                }
                else
                {
                    try
                    {
                        task.ScheduleAndStart(true);
                    }
                    catch (TaskSchedulerException ex)
                    {
                    }
                }
            }
            else
            {
                task.InternalCancel(false);
            }
        }
示例#2
0
        private void Execute <TTask>(IEnumerable <KeyValuePair <Type, Action <object> > > tasks) where TTask : Task
        {
            bool shouldSkip = false;

            foreach (KeyValuePair <Type, Action <object> > taskConfiguration in tasks)
            {
                if (shouldSkip)
                {
                    shouldSkip = false;
                    continue;
                }

                TTask task = (TTask)Adapter.GetService(taskConfiguration.Key);

                Debug.Assert(task != null, "Task should be not null");

                if (taskConfiguration.Value != null)
                {
                    taskConfiguration.Value(task);
                }

                TaskContinuation continuation = task.Execute();

                if (continuation == TaskContinuation.Break)
                {
                    break;
                }

                shouldSkip = continuation == TaskContinuation.Skip;
            }
        }
示例#3
0
        public void Execute_should_continue_task_chain(string ipAddress, TaskContinuation expectedValue)
        {
            httpContext.SetupGet(c => c.Request.UserHostAddress).Returns(ipAddress);
            CacheBlockedIpAddress("192.168.0.1");
            bannedIpAddressRepository.Setup(r => r.IsMatching("192.168.0.2")).Returns(true);

            TaskContinuation actualValue = blockRestrictedIpAddress.Execute();

            Assert.Equal(expectedValue, actualValue);
        }