потокобезопасность ManualWorkflowSchedulerService.RunWorkflow

StackOverflow https://stackoverflow.com/questions/293121

  •  08-07-2019
  •  | 
  •  

Вопрос

Меня интересовало правильное использование ManualWorkflowSchedulerService.RunWorkflow().Нужно ли мне синхронизировать вызовы одного и того же workflowInstanceId в разных потоках при вызове ManualWorkflowSchedulerService.RunWorkflow?

Это было полезно?

Решение

Нет, я так не думаю.Ниже приводится соответствующий отрывок из книга «Основная основа рабочего процесса Windows»

Несмотря на то, что операции на Workflowinstance могут быть вызваны в произвольных потоках, планировщик WF, размещенный в экземпляре программы, обслуживается одним потоком.Время выполнения WF гарантирует, что ни одна другая поток не может вмешиваться или обслуживать планировщика, в то время как его дипетчерский цикл активно обрабатывает рабочие элементы. Чтобы быть ясно, приложение хостинга может одновременно вызывать методы рабочего процесса в отдельных потоках - это не влияет на планировщик, выполняющий действия в выделенном потоке (для эпизода исполнения).


РЕДАКТИРОВАТЬ:Для дальнейшего изучения проблемы я создал wf с ParallelActivity который содержит два HandleExternalEvent деятельность.А invoked обработчик каждого действия просто переводит свой поток в спящий режим на 3 секунды.В главной программе я создал два потока и инициировал два события через службу.Более того, я создаю подкласс ManualWorkflowSchedulerService чтобы отслеживать его Schedule метод.Вот результаты (время указано в десятых долях мс):

Src    Time Thread
HOST   7616      1 CreateWorkflow
MWSS   7642      1 Schedule workflow
HOST   8297     12 Trigger event 1 and wait for RunWorkflow
MWSS   8316     12 Schedule workflow
  WF   8327     12 Handler 1 Invoked...wait 3 sec
HOST   8327      1 Press any key to exit...
HOST   8767     13 Trigger event 2 and wait for RunWorkflow
MWSS   8784     13 Schedule workflow
  WF  38319     12 Handler 1 Completed
  WF  38406     12 Handler 2 Invoked...wait 3 sec
  WF  68396     12 Handler 2 Completed
HOST  68573     13 RunWorkflow for event 2 completed in 5,98 sec
HOST  68794     12 WorkflowCompleted
HOST  68795     12 RunWorkflow for event 1 completed in 6,05 sec

Некоторые замечания:

  1. Планировщик всегда использует поток хоста для планирования рабочего элемента.
  2. Экземпляр рабочего процесса не всегда используйте поток хоста для выполнения действий.Если в потоке уже выполняется другое действие, то этот поток используется для выполнения всех запланированных действий.
  3. Выполнение обработчиков является потокобезопасным, но оба потока ждут завершения работы обоих обработчиков!

Если последнее вас беспокоит, я бы предложил следующие посты:

Кстати, можете ли вы поделиться информацией о сценарии, с которым вы столкнулись?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top