Может ли среда выполнения рабочих процессов Windows запускать 2 рабочих процесса одновременно

Мы использовали шаблон 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
    }
}

person Shiraz Bhaiji    schedule 01.12.2009    source источник
comment
Упс, я разместил комментарий, а потом понял, что ваш пример кода был для вашего решения, а не для вашей проблемы. Я попробую!   -  person Dave    schedule 12.01.2010


Ответы (1)


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

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

person AnthonyWJones    schedule 01.12.2009
comment
Спасибо за ваш ответ, я обновил свой вопрос с образцом кода - person Shiraz Bhaiji; 02.12.2009