2009-12-01 2 views
2

Мы использовали шаблон Factory/Singlton для создания рабочей среды рабочего процесса.Может ли Windows Workflow Runtime одновременно запускать 2 рабочих процесса

Когда мы запускаем рабочий процесс, мы используем AutoResetEvent waitHandle.WaitOne(), чтобы дождаться завершения рабочего процесса.

Если два рабочих процесса работают одновременно, они реагируют на один и тот же AutoResetEvent, и оба вызова получают возвращаемые значения, предназначенные для первого вызова.

Есть ли способ исправить это, не создавая новую рабочую среду рабочего процесса для каждого вызова?

Благодаря

Шираз

EDIT

Вот упрощенная версия кода:

public class Process: IProcess 
{ 
    private AutoResetEvent waitHandle = new AutoResetEvent(false); 
    /// <summary> 
    /// ReturnValues 
    /// </summary> 
    private Dictionary<string, object> ReturnValues; 

    public ProcessCargo Preprocess(ProcessorCargo cargo) 
    { 
      try 
      { 
       WorkflowRuntime workflowRuntime = WorkflowFactory.GetWorkflowRuntime(); 

       workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(workflowCompleted); 
       workflowRuntime.WorkflowTerminated += new EventHandler<WorkflowTerminatedEventArgs>(workflowTerminated); 
       workflowRuntime.ServicesExceptionNotHandled += new EventHandler<ServicesExceptionNotHandledEventArgs>(workflowRuntime_ServicesExceptionNotHandled);      

       Dictionary<string, object> parameters = new Dictionary<string, object>(); 
       // Add Parameters 

       WorkflowInstance workflowInstance; 
       workflowInstance = workflowRuntime.CreateWorkflow(typeof(ProcessWorkflow), parameters); 
       workflowInstance.Start(); 

       waitHandle.WaitOne(); 

       cargo.A = (A)ReturnValues[KeyA]; 

      } 
      catch (Exception e) 
      { 
       LoggingHelper.LogFault(e); 
       throw; 
      } 
      return cargo; 
    } 

Вот рабочего процесса завода, он основан на коде в Windows Workflow Foundation Пошаговая книга:

public static class WorkflowFactory 
{ 
    // Singleton instance of the workflow runtime 
    private static WorkflowRuntime _workflowRuntime = null; 

    // Lock (sync) object 
    private static object _syncRoot = new object(); 

    /// <summary> 
    /// Factory method 
    /// </summary> 
    /// <returns></returns> 
    public static WorkflowRuntime GetWorkflowRuntime() 
    { 
     // Lock execution thread in case of multi-threaded 
     // (concurrent) access. 
     lock (_syncRoot) 
     { 
      // Check for startup condition 
      if (null == _workflowRuntime) 
      { 
       // Provide for shutdown 
       AppDomain.CurrentDomain.ProcessExit += new EventHandler(StopWorkflowRuntime); 
       AppDomain.CurrentDomain.DomainUnload += new EventHandler(StopWorkflowRuntime); 

       // Not started, so create instance 
       _workflowRuntime = new WorkflowRuntime(); 

       // Start the runtime 
       _workflowRuntime.StartRuntime(); 
      } // if 

      // Return singleton instance 
      return _workflowRuntime; 
     } // lock 
    } 

    // Shutdown method 
    static void StopWorkflowRuntime(object sender, EventArgs e) 
    { 
     if (_workflowRuntime != null) 
     { 
      if (_workflowRuntime.IsStarted) 
      { 
       try 
       { 
        // Stop the runtime 
        _workflowRuntime.StopRuntime(); 
       } 
       catch (ObjectDisposedException) 
       { 
        // Already disposed of, so ignore... 
       } // catch 
      } // if 
     } // if 
    } 
} 
+0

Показать нам код? – AnthonyWJones

+0

Упс, я отправил комментарий, а затем понял, что ваш образец кода был для вашего * решения *, а не вашей проблемы. Я попробую! – Dave

ответ

2

Одна рабочая среда рабочего процесса Windows может одновременно запускать множество рабочих процессов. Его код, который вы разместили вокруг среды выполнения, которая нуждается в исправлении.

Что ждет на ручке ожидания? Почему ждет? Почему вы используете один и тот же дескриптор для нескольких экземпляров Workflow?

+0

Спасибо за ваш ответ. Я обновил свой вопрос с помощью примера кода –