坚持学习WF(19):工作流线程

置顶]坚持学习WF文章索引

 

WF中提供了很多内置的服务,其中工作流计划服务是用来管理工作流实例线程的。默认情况下WF会自动使用DefaultWorkflowSchedulerService服务。使用该服务时在工作流运行时引擎上以异步方式运行工作流实例的线程。 等待运行的工作流存储在 DefaultWorkflowSchedulerService 的内部队列中.当 DefaultWorkflowSchedulerService 要启动工作流时,从 .NET Framework 线程池中获取一个线程并使用此线程运行工作流。 MaxSimultaneousWorkflows 属性确定调度程序服务同一时间允许的并发线程数。 例如,如果限值为 4,则 DefaultWorkflowSchedulerService 将从 .NET Framework 线程池中最多获取 4 个线程来执行工作流。 如果已经运行 4 个工作流,则其他工作项(工作流)将放入队列中,最终在线程可用时执行。

 

除了使用WF默认提供的,我们还可以手动去加载ManualWorkflowSchedulerService服务。它提供了一个线程服务,该服务允许创建工作流实例的宿主应用程序指定用于运行工作流实例的 Thread。 使用此线程服务,宿主应用程序可在单个 Thread 上运行一个工作流实例(即处于同步模式)。 此模式将阻止宿主应用程序的执行,直到工作流实例进入空闲状态。 随后,只能通过使用此服务的 RunWorkflow 方法执行工作流实例。

 

下面我们通过MSDN中的一个例子来说明工作流中的线程以及如何使用DefaultWorkflowSchedulerService和ManualWorkflowSchedulerService服务。

 

一:在该实例中首先开发一个自定义活动WaitForMessageActivity.cs,代码如下:

using System;
using System.ComponentModel;
using System.Threading;
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
namespace Microsoft.Samples.Workflow.WorkflowThreading
{
    [ToolboxItem(typeof(ActivityToolboxItem))]
    public partial class WaitForMessageActivity: Activity
   
{
        WorkflowQueue workflowQueue;

        public WaitForMessageActivity()
        {
            InitializeComponent();
        }

        protected override void Initialize(IServiceProvider provider)
        {
            ThreadMonitor.WriteToConsole(Thread.CurrentThread, "WaitForMessageActivity",
                                         "WaitForMessageActivity执行构造函数");
            WorkflowQueuingService queuingService = (WorkflowQueuingService)provider.
                                         GetService(typeof(WorkflowQueuingService));
            this.workflowQueue = queuingService.CreateWorkflowQueue(
                                         "WaitForMessageActivityQueue", false);
            this.workflowQueue.QueueItemAvailable += this.HandleExternalEvent;
        }

        private void HandleExternalEvent(Object sender, QueueEventArgs args)
        {
            ThreadMonitor.WriteToConsole(Thread.CurrentThread, "WaitForMessageActivity",
                                         "WaitForMessageActivity外部事件处理程序");
            object data = this.workflowQueue.Dequeue();
            ActivityExecutionContext context = sender as ActivityExecutionContext;
            context.CloseActivity();
        }

        protected override ActivityExecutionStatus Execute(ActivityExecutionContext context)
        {
            ThreadMonitor.WriteToConsole(Thread.CurrentThread, "WaitForMessageActivity",
                                         "WaitForMessageActivity等待外部事件处理程序");
            return ActivityExecutionStatus.Executing;
        }
    }
}

二:工作流设计如下图:
 
 
 
DelayActivity对工作流的影响我们在前面的文章中有过说明,我们就不管这个了。工作流的代码如下:
 
using System;
using System.ComponentModel;
using System.Workflow.Activities;
using System.Threading;
namespace Microsoft.Samples.Workflow.WorkflowThreading
{
    public sealed partial class ThreadingWorkflow : SequentialWorkflowActivity
    {
        private string branchFlag;

        public ThreadingWorkflow()
        {
            InitializeComponent();
            ThreadMonitor.WriteToConsole(Thread.CurrentThread, "ThreadingWorkflow", 
"ThreadingWorkflow: 执行构造函数"); } public string BranchFlag { get { return this.branchFlag;} set { this.branchFlag = value;} } private void OnCodeActivity1ExecuteCode(object sender, EventArgs e) { ThreadMonitor.WriteToConsole(Thread.CurrentThread, "ThreadingWorkflow",
"CodeActivity1的事件处理程序"); } private void OnCodeActivity2ExecuteCode(object sender, EventArgs e) { ThreadMonitor.WriteToConsole(Thread.CurrentThread, "ThreadingWorkflow",
"CodeActivity2的事件处理程序"); } private void OnCodeActivity3ExecuteCode(object sender, EventArgs e) { ThreadMonitor.WriteToConsole(Thread.CurrentThread, "ThreadingWorkflow",
"CodeActivity3的事件处理程序"); } private void IfElseBranchActivityCodeCondition(object sender, ConditionalEventArgs e) { e.Result = !this.BranchFlag.Equals("Delay", StringComparison.OrdinalIgnoreCase); } } }
三:宿主程序代码如下:
 
using System;
using System.Collections.Generic;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
using System.Drawing;
namespace Microsoft.Samples.Workflow.WorkflowThreading
{
    class Program
    {
        static AutoResetEvent waitHandle = new AutoResetEvent(false);
        static AutoResetEvent readyHandle = new AutoResetEvent(false);
        static WorkflowInstance workflowInstance;
        static WorkflowRuntime workflowRuntime;

        static void Main(string[] args)
        {
            if (args.Length < 2)
            {
                Console.WriteLine("使用该形式命令行WorkflowThreading.exe [Single | Multi] 
[Delay | WaitForMessage]"
); return; } if (!args[0].Equals("Single", StringComparison.OrdinalIgnoreCase) &&
!args[0].Equals("Multi", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("指定Single 或者Multi 作为第一个命令行参数"); return; } if (!args[1].Equals("Delay", StringComparison.OrdinalIgnoreCase) &&
!args[1].Equals("WaitForMessage", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("指定Delay 或者WaitForMessage 作为第二个命令行参数"); return; } ThreadMonitor.Enlist(Thread.CurrentThread, "主机"); Console.ForegroundColor = ConsoleColor.White; using (workflowRuntime = new WorkflowRuntime()) { ManualWorkflowSchedulerService scheduler = null; if (args[0].ToString().Equals("Single", StringComparison.OrdinalIgnoreCase)) { scheduler = new ManualWorkflowSchedulerService(); workflowRuntime.AddService(scheduler); } workflowRuntime.StartRuntime(); workflowRuntime.WorkflowCompleted += OnWorkflowCompleted; workflowRuntime.WorkflowTerminated += OnWorkflowTerminated; workflowRuntime.WorkflowIdled += OnWorkflowIdled; workflowRuntime.WorkflowCreated += OnWorkflowCreated; Type type = typeof(ThreadingWorkflow); Dictionary<string, object> workflowParameters = new Dictionary<string, object>(); workflowParameters.Add("BranchFlag", args[1]); Console.WriteLine("\n--- 开始工作流之前---\n"); workflowInstance = workflowRuntime.CreateWorkflow(type, workflowParameters); workflowInstance.Start(); Console.WriteLine("\n--- 开始工作流之后---\n"); if (scheduler != null) scheduler.RunWorkflow(workflowInstance.InstanceId); readyHandle.WaitOne(); if (args[1].Equals("WaitForMessage", StringComparison.OrdinalIgnoreCase)) { workflowInstance.EnqueueItem("WaitForMessageActivityQueue", "Hello",
null, null); } if (scheduler != null) scheduler.RunWorkflow(workflowInstance.InstanceId); waitHandle.WaitOne(); workflowRuntime.StopRuntime(); } } static void OnWorkflowCreated(object sender, WorkflowEventArgs e) { ThreadMonitor.WriteToConsole(Thread.CurrentThread, "Host",
"Host: Processed WorkflowCreated Event"); } static void OnWorkflowIdled(object sender, WorkflowEventArgs e) { if (workflowRuntime.GetService<ManualWorkflowSchedulerService>() != null) SetReloadWorkflowTimer(); else readyHandle.Set(); ThreadMonitor.WriteToConsole(Thread.CurrentThread, "Host",
"Host: Processed WorkflowIdle Event"); Console.WriteLine("\n--- 工作流空闲---\n"); } static void SetReloadWorkflowTimer() { DateTime reloadTime = workflowInstance.GetWorkflowNextTimerExpiration(); if (reloadTime == DateTime.MaxValue) { readyHandle.Set(); } else { TimeSpan timeDifference = reloadTime - DateTime.UtcNow + new TimeSpan(0, 0, 0, 0, 1); Timer timer = new System.Threading.Timer( new TimerCallback(ReloadWorkflow), null,timeDifference < TimeSpan.Zero ? TimeSpan.Zero : timeDifference, new TimeSpan(-1)); } } static void ReloadWorkflow(object state) { if (workflowInstance.GetWorkflowNextTimerExpiration() > DateTime.UtcNow) SetReloadWorkflowTimer(); else readyHandle.Set(); } static void OnWorkflowCompleted(object sender, WorkflowCompletedEventArgs e) { ThreadMonitor.WriteToConsole(Thread.CurrentThread, "Host",
"Host: Processed WorkflowCompleted Event"); waitHandle.Set(); Console.WriteLine("\n--- 工作流完成---\n"); } static void OnWorkflowTerminated(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set(); } } }
 
在宿主程序我们根据命令行参数的不同来决定是否加载ManualWorkflowSchedulerService ,如果加载了该服务我们
调用该类的RunWorkflow方法来运行工作流实例。
 
四:ThreadMonitor类的用途是用不同的颜色为每个线程的输出着色。代码如下:
 
using System;
using System.Threading;
using System.Collections.Generic;
using System.Text;
namespace Microsoft.Samples.Workflow.WorkflowThreading
{
    public static class ThreadMonitor
    {
        private static int threadCount;
        private static Dictionary<string, ConsoleColor> threadList = new 
Dictionary<string, ConsoleColor>(); public static void Enlist(Thread thread, string instanceName) { if ((thread.Name == null) || (thread.Name.Length == 0)) { thread.Name = string.Format("{0} 线程[{1}]", instanceName, threadCount++); if (!threadList.ContainsKey(thread.Name)) threadList.Add(thread.Name, GetConsoleColor()); } } public static void WriteToConsole(Thread thread, string instanceName, string message) { Enlist(thread, instanceName); WriteToConsole(thread, message); } public static void WriteToConsole(Thread thread, string message) { if (threadList.ContainsKey(thread.Name)) Console.ForegroundColor = threadList[thread.Name]; Console.WriteLine("{0} --> {1}", thread.Name, message); } private static ConsoleColor GetConsoleColor() { if ((int)Console.ForegroundColor < 9) return ConsoleColor.White; else return (ConsoleColor)(int)Console.ForegroundColor - 1; } } }
五:下图是执行的结果对比,我们可以清晰的看到线程的变化情况。
 
 

本文转自生鱼片博客园博客,原文链接:http://www.cnblogs.com/carysun/archive/2008/09/07/WFThread.html,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: u8 生产工作是一种企业资源计划(ERP)系统,用于管理和优化生产程。在这个系统中,wf_activeflow instance(工作活动实例)是指正在进行中的工作程。 wf_activeflow instance 是根据预先定义的工作模板创建的,它根据具体的生产任务和需求进行自动化和调度。每个工作活动实例都有一个唯一的标识符,以便系统能够跟踪和管理它们的状态。 工作活动实例可以通过多种方式创建,例如,当一个新的生产任务被指派给某个员工时,系统会自动创建相应的工作活动实例。这个实例将指导员工完成任务的各个阶段,包括访问生产文件、审批报告、记录生产数据等。 在整个生产过程中,工作活动实例可以根据需要进行调整和修改。例如,如果有新的需求或紧急情况出现,可以通过修改工作活动实例的程或添加额外的活动来适应变化。 通过使用u8 生产工作 wf_activeflow instance,企业可以实现生产过程的自动化和优化。这不仅提高了生产效率,减少了错误和延迟,还提供了实时监控和数据分析功能,帮助企业精确掌握生产进度和资源分配。 总之,u8 生产工作 wf_activeflow instance 在生产管理中发挥了重要的作用,为企业实现高效和可持续的生产提供了强有力的支持。 ### 回答2: u8 生产工作wf_activeflow instance)是用于管理和监控业务程的工具。它是u8企业管理软件的一部分,旨在帮助企业提高生产效率和管理制度。 u8生产工作可以通过定义和实施工作程来规范企业的生产程。它可以将复杂的生产过程划分为一系列简单的任务和环节,并通过自动化和协作功能来简化和加快任务的执行。该工作可以适应企业的不同生产模式和业务需求,提供灵活的配置选项。 在运行过程中,wf_activeflow instance可以实时跟踪和监控工作的执行情况。它记录每个任务的状态和进展,并提供详细的报表和统计信息。这些数据可以帮助企业了解生产过程中的瓶颈和问题,及时做出调整和改进。 此外,u8生产工作还具有权限管理功能,可以根据用户角色和职责来限制和控制任务的执行权限。这样能够确保只有具备相应权限的人员才能参与和操作生产过程,保证生产活动的安全性和可靠性。 总之,u8生产工作wf_activeflow instance)是一个强大的工具,可以帮助企业规范和优化生产程,提高生产效率和质量。它是u8软件在生产管理领域的核心组件之一,为企业提供了全面的生产管理解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值