Может ли Windows Workflow Runtime запускать 2 рабочих процесса одновременно - PullRequest
2 голосов
/ 01 декабря 2009

Мы использовали шаблон Factory / Singlton для создания среды выполнения рабочего процесса.

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

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

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

Спасибо

Шираз

РЕДАКТИРОВАТЬ

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

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
    }
}

1 Ответ

2 голосов
/ 01 декабря 2009

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

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

...