在WF 4.0中同时运行多个工作流的最佳方法

时间:2009-09-08 20:21:31

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

我有一个例程,它创建特定工作流的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();

3 个答案:

答案 0 :(得分:4)

我认为从这里到最简单的方法就是创建多个等待句柄并以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());

答案 1 :(得分:1)

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

答案 2 :(得分:0)

你真的需要它们在不同的线程上运行吗?我在想,因为你已经在使用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}
        });
}