2009-09-08 5 views
4

특정 워크 플로우의 n 개의 인스턴스를 생성하고 각각을 연속적으로 실행하는 루틴이 있습니다. 비동기 해제하려면 어떻게해야합니까?WF 4.0에서 동시에 여러 워크 플로우를 실행하는 가장 좋은 방법

현재 P 코드 :

forloop

// 만들기 var에 syncEvent = 새로운 AutoResetEvent (false)를; WorkflowInstance myInstance = new WorkflowInstance (새 SomeWorkflow(), 매개 변수);

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

답변

4

여기서부터 시작하는 가장 쉬운 방법은 여러 개의 대기 핸들을 만들고 WaitAll()로 끝내는 것입니다. 가장 우아한 솔루션은 아니지만 귀하에게 도움이 될 것입니다. BTW, 관련 대기 핸들에 대한 참조를 보유하고 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()); 
+0

피해야 할 anon 방식의 단점은 무엇입니까? –

1

병렬 프레임 워크를 사용하면 더 쉬울 것입니다.

+0

동일한 작업 흐름을 N 번 실행하고 싶지만 각 프로세스의 트리거가 호스트 프로세스에 의해 인스턴스화되므로 작동하지 않을 것입니다. –

0

별도의 스레드에서 실행해야합니까? 워크 플로를 사용하고 있기 때문에 이미 생각하고 있습니다. 워크 플로를 사용하여 문제를 해결하는 것이 가장 쉽습니다.

{ 
    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} 
     }); 
} 
관련 문제