2010-02-22 5 views
1

В настоящее время я использую последовательные рабочие процессы в Windows WF, но вам нужно разбить процесс, потому что теперь у меня есть несколько рабочих процессов, которым необходимо разделить функциональность. Я считаю, что есть способ создать пользовательские действия кода в WF, которые в основном выполнили бы это, но мой план состоит в том, чтобы в конечном итоге сорвать WF в пользу Stateless; поэтому я не хочу тратить время на то, чтобы научиться программировать пользовательские действия.Выполнение рабочего процесса из другого рабочего процесса

Единственное, что я могу придумать, это создать новый проект WF, содержащий все «общие» поведения, а затем запустить их из рабочих потоков, которые в них нуждаются. Я сейчас работаю над этим, чтобы понять, как это происходит, но может ли кто-нибудь сказать мне, что это просто плохая идея?

EDIT - «проблема» один я вижу сейчас, что я использую синглтон для выполнения WF, как я испытал огромные утечки памяти раньше, даже когда я выбрасывайте WF RT правильно. Я отслеживаю все экземпляры WF в первом вызывающем объекте рабочего процесса, поэтому для правильной обработки событий мне придется передать этот список экземпляров WF в рабочий процесс, чтобы он мог добавлять WF, который я запускаю изнутри. Кажется немного беспорядочным для меня, хотя я, конечно, все еще могу попробовать это так. Я отслеживаю экземпляры WF, потому что я пытаюсь использовать это, чтобы включить функции Pause/Abort/Resume. Когда пользователь нажимает соответствующую кнопку в графическом интерфейсе, он перебирает все экземпляры WF и вызывает метод сопоставления.

ответ

1

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

Другое, думайте, что нужно иметь в виду обработку ошибок. Когда дочерний процесс работает, основной рабочий процесс не знает об этом, совершенно другое поведение от добавления дочерних действий.

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

+0

Спасибо, Морис, я рассмотрю ваши предложения. Однако, просто чтобы сыграть адвоката дьявола, почему бы основной рабочий процесс не дождался завершения детского рабочего процесса? У меня есть активность кода в основном WF, который запускает экземпляр дочернего рабочего процесса, но я использую AutoResetEvent для создания блока активности кода. Только до тех пор, пока дочерний рабочий процесс не завершится (и не назначит событие в обработчике WorkflowCompleted), основной рабочий процесс продолжается. В настоящее время я разорван на обработку ошибок - следует ли использовать try/catch или FaultHandlers? – Dave

+0

Я думаю, мне нужно перечитать эту статью: http://msdn.microsoft.com/en-us/magazine/dd419656.aspx – Dave

+0

Морис, после успешного внедрения подхода workflow-in-the-workflow, я попробовал предложение. Я был очень рад видеть, насколько легко и логично создать настраиваемую деятельность, которую вы можете просто добавить в другие рабочие процессы. Мой единственный вопрос теперь в том, каков механизм получения параметров, передаваемых в рабочий процесс, в пользовательскую активность? Поскольку активность внутри рабочего процесса, я ожидаю, что он каким-то образом сможет получить доступ к параметрам рабочего процесса, но пока не нашел ответа. ** ИЗМЕНИТЬ ** ОК, я ткнул и только что увидел их в окне свойств в дизайнере! – Dave

Смежные вопросы