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

我有一个例程,创build一个特定的工作stream程的n个实例,并连续运行它们。 我怎么能把它们解雇呢?

当前的p代码:

for循环

//创buildvar 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(); 

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

  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()); 

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

你真的需要它们在不同的线程上运行吗? 我在考虑,既然你使用的是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} }); }