Я бы сделал пару замечаний по поводу кода, который вы используете в данный момент.Делая все возможное для оптимизации вашего кода, вы должны твердо помнить о цели, когда ваш код достаточно эффективен, так как оптимизация кода имеет тенденцию следовать закону убывающей отдачи, так как оптимизация кода требует все больше и больше усилий.
Самая простая вещь, которую я могу придумать для увеличения скорости кодов, это установить для свойства ValidateOnCreate в экземпляре WorkflowRuntime значение false.По умолчанию установлено значение true, что означает, что каждый раз, когда вы создаете свой экземпляр рабочего процесса.Я предполагаю, что ваш рабочий процесс является статическим в том смысле, что вы не вносите в него динамические изменения во время выполнения, а скорее определяете его во время компиляции.Если это так, вы можете пропустить этап проверки.В зависимости от того, насколько сложен ваш рабочий процесс, это может значительно улучшить скорость кода.
Если предположить, что это не увеличит скорость достаточно, другое предложение следующее.Создайте объекты WaitHandle, Request и Workflow, используемые в экземплярах экземпляра метода Execute класса ApprovalWorkflowRunner.WorkflowRuntime будет параметром для метода Execute.При этом вы должны создавать новый экземпляр класса ApprovalWorkflowRunner каждый раз, когда хотите запустить рабочий процесс ApprovalFlow.Ваш метод Execute должен выглядеть примерно так:
public Request Execute(Action action, WorkflowRuntime workflowRuntime) {
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
workflowRuntime.WorkflowTerminated += new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_WorkflowTerminated);
var parameters = new Dictionary<string, object>
{
{"RepositoryInstance", Repository},
{"RequestID", action.RequestID.ToString()},
{"ActionCode", action.ToString()}
};
mWorkflowInstance = workflowRuntime.CreateWorkflow(typeof(ApprovalFlow), parameters);
mWorkflowInstance.Start();
mWaitHandle.WaitOne();
return mRequest;
}
Обработчики событий внутри класса ApprovalWorkflowRunner будут выглядеть примерно так:
void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e) {
if (!e.WorkflowInstance.Equals(mWorkflowInstance)) return;
mRequest = e.OutputParameters["gRequest"] as Request;
mWaitHandle.Set();
return;
}
Обратите внимание, что я переключил две строкивнутри обработчика от того, как они были в вашем коде, установка дескриптора ожидания до , когда вы назначаете экземпляр запроса, создает условие состязания.
На последнем замечании: вызов Disposeметод в экземпляре WorkflowRuntime, очевидно, должен был бы иметь место в другом месте вашего кода;однако Microsoft рекомендует вызывать метод StopRuntime до вызова Dispose: Замечания: корректно завершить WorkflowRuntime
Надеюсь, это поможет