wait.cs

来自「WF本质论一书的源码,要书籍的朋友同我联系.」· CS 代码 · 共 59 行

CS
59
字号
using System;
using System.Threading;
using System.Workflow.Runtime;
using System.Collections.Generic;
using System.Workflow.ComponentModel;
using EssentialWF.Services;

namespace EssentialWF.Activities {
    public class Wait : Activity {
        private Guid timerId;
        public static readonly DependencyProperty DurationProperty
           = DependencyProperty.Register("Duration",
            typeof(TimeSpan), typeof(Wait));

        public TimeSpan Duration {
            get { return (TimeSpan)GetValue(DurationProperty); }
            set { SetValue(DurationProperty, value); }
        }

        protected override ActivityExecutionStatus Execute(ActivityExecutionContext context) {

            timerId = Guid.NewGuid();

            WorkflowQueuingService qService = context.GetService<WorkflowQueuingService>();

            WorkflowQueue queue = qService.CreateWorkflowQueue(timerId, false);
            queue.QueueItemAvailable += this.ContinueAt;

            TimerService timerService = context.GetService<TimerService>();
            timerService.SetTimer(this.Duration,
                timerId, base.WorkflowInstanceId);

            return ActivityExecutionStatus.Executing;
        }

        void ContinueAt(object sender, QueueEventArgs e) {
            ActivityExecutionContext context = sender as ActivityExecutionContext;

            WorkflowQueuingService qService = context.GetService<WorkflowQueuingService>();

            WorkflowQueue queue = qService.GetWorkflowQueue(timerId);
            qService.DeleteWorkflowQueue(timerId);

            context.CloseActivity();
        }
        protected override ActivityExecutionStatus Cancel(ActivityExecutionContext context) {
            WorkflowQueuingService qService = context.GetService<WorkflowQueuingService>();

            if (qService.Exists(timerId)) {
                TimerService timerService = context.GetService<TimerService>();

                timerService.CancelTimer(timerId);
                qService.DeleteWorkflowQueue(timerId);
            }
            return ActivityExecutionStatus.Closed;
        }
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?