Потоковая безопасность ManualWorkflowSchedulerService.RunWorkflow - PullRequest
1 голос
/ 16 ноября 2008

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

1 Ответ

3 голосов
/ 16 ноября 2008

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

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


РЕДАКТИРОВАТЬ: Для дальнейшего изучения проблемы, я создал 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. Выполнение обработчиков потокобезопасно, но оба потока ждут завершения обоих обработчиков!

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

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

...