【问题标题】:Best way to run multiple workflows concurrently in WF 4.0在 WF 4.0 中同时运行多个工作流的最佳方式
【发布时间】:2009-09-08 20:21:31
【问题描述】:

我有一个例程,它创建特定工作流的 n 个实例并依次运行它们。我怎么能异步解雇他们?

当前 p 码:

for循环

// 创建 var syncEvent = new AutoResetEvent(false); WorkflowInstance myInstance = new WorkflowInstance(new SomeWorkflow(), parameters);

            // Events

            // Completed
            myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e) { syncEvent.Set(); };

            // Unhandled Exception
            myInstance.OnUnhandledException = delegate(WorkflowUnhandledExceptionEventArgs e)
            {
                // Message
                Console.WriteLine(e.UnhandledException.ToString());
                return UnhandledExceptionAction.Terminate;
            };

            // Aborted
            myInstance.OnAborted = delegate(WorkflowAbortedEventArgs e)
            {
                // Message
                Console.WriteLine(e.Reason);
                syncEvent.Set();
            };

            // Run
            myInstance.Run();

            // Wait
            syncEvent.WaitOne();

【问题讨论】:

    标签: c# windows workflow-foundation workflow-foundation-4


    【解决方案1】:

    我认为从这里到那里的最简单方法就是创建多个等待句柄并以 WaitAll() 结束。不是最优雅的解决方案,但它会为您工作。顺便说一句,我建议使用一个真正的类来保存对相关等待句柄的引用并避免使用匿名方法。

            List<ManualResetEvent> items = new List<ManualResetEvent>();
    
            foreach (Type job in queue)
            {
                WorkflowInstance myInstance = new WorkflowInstance(job, parameters);
    
                ManualResetEvent syncEvent = new ManualResetEvent(false);
                items.Add(syncEvent);
    
                // Completed
                myInstance.OnCompleted = delegate(WorkflowCompletedEventArgs e) 
                { 
                    syncEvent.Set(); 
                };
                // Unhandled Exception
                myInstance.OnUnhandledException = delegate(WorkflowUnhandledExceptionEventArgs e)
                {
                    // Message
                    Console.WriteLine(e.UnhandledException.ToString());
                    return UnhandledExceptionAction.Terminate;
                };
    
                // Aborted
                myInstance.OnAborted = delegate(WorkflowAbortedEventArgs e)
                {
                    // Message
                    Console.WriteLine(e.Reason);
                    syncEvent.Set();
                };
    
                // Run
                myInstance.Run();
            }
    
            // Wait
            WaitHandle.WaitAll(items.ToArray());
    

    【讨论】:

    • 您要避免的匿名方法的缺点是什么?
    【解决方案2】:

    使用并行框架,会更容易。

    【讨论】:

    • 我想运行相同的工作流 N 次,但是每个触发器的触发器都是由主机进程实例化的,所以我不相信这会起作用。
    【解决方案3】:

    您真的需要它们在不同的线程上运行吗?我在想,既然您已经在使用 Workflow,那么使用工作流“组织您的工作”来解决问题应该是最容易的。

    {
        var ArgsToProcess = new List<string> { "arg_one", "arg_two", "arg_three" };
    
        var delegateArg = new DelegateInArgument<string> { Name = "s" };
    
        Activity toRun = new ParallelForEach<string>
        {
            Body = new ActivityAction<string>
            {
                Argument = delegateArg,
                Handler = new Workflow1() //Plug your workflow here  
                {
                    Arg = delegateArg
                }
            }
        };
    
        WorkflowInvoker.Invoke(toRun, new Dictionary<string, object>
            {
                {"Values", ArgsToProcess}
            });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      相关资源
      最近更新 更多