потокобезопасность ManualWorkflowSchedulerService.RunWorkflow
-
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
Некоторые замечания:
- Планировщик всегда использует поток хоста для планирования рабочего элемента.
- Экземпляр рабочего процесса не всегда используйте поток хоста для выполнения действий.Если в потоке уже выполняется другое действие, то этот поток используется для выполнения всех запланированных действий.
- Выполнение обработчиков является потокобезопасным, но оба потока ждут завершения работы обоих обработчиков!
Если последнее вас беспокоит, я бы предложил следующие посты:
- Понимание ParallelActivity в рабочем процессе Windows
- Используйте рабочий процесс для параллельного вызова веб-служб
Кстати, можете ли вы поделиться информацией о сценарии, с которым вы столкнулись?