예제 #1
0
        public override void Start(CancellationToken cancellationToken)
        {
            base.Start(cancellationToken);
            cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
            stopPending             = false;

            try {
                Run(cancellationTokenSource.Token);
            } catch (OperationCanceledException) {
            } catch (AggregateException ae) {
                ae.FlattenAndHandle(new[] { typeof(OperationCanceledException) }, e => OnExceptionOccurred(e));
            } catch (Exception e) {
                OnExceptionOccurred(e);
            }

            cancellationTokenSource.Dispose();
            cancellationTokenSource = null;
            if (stopPending)
            {
                ExecutionStack.Clear();
            }
            if (stopPending || !CanContinue)
            {
                OnStopped();
            }
            else
            {
                OnPaused();
            }
        }
예제 #2
0
 public virtual void Step(bool skipStackOperations)
 {
     OnStarted();
     cancellationTokenSource = new CancellationTokenSource();
     stopPending             = false;
     lastUpdateTime          = DateTime.UtcNow;
     timer.Start();
     try {
         ProcessNextOperation(true, cancellationTokenSource.Token);
         while (skipStackOperations && !(CurrentOperation is IAtomicOperation) && CanContinue)
         {
             ProcessNextOperation(true, cancellationTokenSource.Token);
         }
     } catch (Exception ex) {
         OnExceptionOccurred(ex);
     }
     timer.Stop();
     ExecutionTime += DateTime.UtcNow - lastUpdateTime;
     cancellationTokenSource.Dispose();
     cancellationTokenSource = null;
     if (stopPending)
     {
         ExecutionStack.Clear();
     }
     if (stopPending || !CanContinue)
     {
         OnStopped();
     }
     else
     {
         OnPaused();
     }
 }
예제 #3
0
 public sealed override void Prepare()
 {
     base.Prepare();
     ExecutionStack.Clear();
     CurrentOperation = null;
     OperatorTrace.Reset();
     OnPrepared();
 }
예제 #4
0
 public void Prepare(IOperation initialOperation)
 {
     base.Prepare();
       ExecutionStack.Clear();
       if (initialOperation != null)
     ExecutionStack.Add(initialOperation);
       CurrentOperation = null;
       OperatorTrace.Reset();
       OnPrepared();
 }
예제 #5
0
 public override void Stop()
 {
     CurrentOperation = null;
       base.Stop();
       if (ExecutionState == ExecutionState.Paused) {
     ExecutionStack.Clear();
     OnStopped();
       } else {
     stopPending = true;
     cancellationTokenSource.Cancel();
       }
 }
예제 #6
0
        public override void Start()
        {
            base.Start();
            cancellationTokenSource = new CancellationTokenSource();
            stopPending             = false;
            Task task = Task.Factory.StartNew(Run, cancellationTokenSource.Token, cancellationTokenSource.Token);

            task.ContinueWith(t => {
                try {
                    t.Wait();
                }
                catch (AggregateException ex) {
                    try {
                        ex.Flatten().Handle(x => x is OperationCanceledException);
                    }
                    catch (AggregateException remaining) {
                        if (remaining.InnerExceptions.Count == 1)
                        {
                            OnExceptionOccurred(remaining.InnerExceptions[0]);
                        }
                        else
                        {
                            OnExceptionOccurred(remaining);
                        }
                    }
                }
                cancellationTokenSource.Dispose();
                cancellationTokenSource = null;

                if (stopPending)
                {
                    ExecutionStack.Clear();
                }
                if (stopPending || !CanContinue)
                {
                    OnStopped();
                }
                else
                {
                    OnPaused();
                }
            });
        }