Программирование >>  Программирование с использованием ajax 

1 ... 384 385 386 [ 387 ] 388 389 390 ... 396


fuspendActivityl System.WocHlow.Compoi

Sequential Workflow

ep*ndAftTvH

II suspendActivtyl

Description

Enabled

Error

True

Puc, 36.5. Свойства SuspendActivity

В случае приостановки рабочего потока в Workf lowRuntime генерируется событие Workf lowSuspended, и на этом этапе как раз и можно использовать сообщение об ошибке для принятия решения о том, какое действие должно быть выполнено дальше. Приостановленный рабочий поток не может возобновлять свою работу самостоятельно - поэтому требуется получать экземпляр рабочего потока и вызывать для него метод Resume О.

С учетом вероятности выполнения в одно и то же время многих экземпляров одного и того же рабочего потока, возникает вопрос о том, а как из них всех можно вычленять именно тот, который был приостановлен?

При запуске любого рабочего потока ему присваивается уникальный идентификатор Quid. Для этого идентификатора Guid при запуске экземпляра рабочего потока можно устанавливать свое значение, как показано в приведенном ниже коде; в случае отсутствия такого кода, однако, исполняющая среда (Workf lowRuntime) будет создавать уникальный идентификатор самостоятельно.

Guid thelnstanceld = Guid.NewGuid();

Dictionary<string, object> parms = new Dictionary<string,object>() ;

Workflowlnstance instance = workflowRuntime.CreateWorkflow (typeof( 3 Suspend.Workflowl), parms, thelnstanceld);

instance.Start 0;

Здесь функция Guid.NewGuid() создает для рабочего потока новый уникальный идентификатор, который передается в третьем параметре вызову CreateWorkf low. Параметр dictionaryo передает в экземпляр рабочего потока данные, о чем более подробно будет рассказываться позже в этой главе.

Наличие такого уникального идентификатора позволяет далее запрашивать у Workf lowRuntime конкретный экземпляр Workf lowlnstance на основании этого идентификатора:

Workflowlnstance wf = workflowRuntime.GetWorkflow(thelnstanceld); wf .Resume () ;

Метод GetWorkf low 0 принимает параметр Guid и пытается отыскать экземпляр с таким идентификатором. В случае передачи ему недействительного значения Guid генерируется исключение System. InvalidOperationException.

Действие TerminateActivity работает похожим образом, но только не приостанавливает, а немедленно прекращает выполнение экземпляра рабочего потока и генерирует в исполняющей среде событие Workf lowTerminated. После завершения выполнения рабочего потока подобным образом его возобновление уже не возможно.



Действие WhileActivity

Действие WhileActivity функционирует точно так же, как и традиционный оператор while в языке С#, а именно - позволяет выполнять несколько действий в цикле. Его главное отличие заключается в том, что оно представляет собой составное действие, т.е. такое, которое может содержать другие действия. На рис. 36.6 показано, как действие WhileActivity и его свойства выглядят после перетаскивания в окно визуального конструктора.

Sequenti4t WorVflow

ActivTtyl rtefTi Vvu H: JA Act .itiesV

whJIActMtyl (None)

Condition

Description

Enabled

Drop an Activity

Puc. 36.6. Свойства WhileActivity

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

Определять условие в коде можно путем разворачивания раскрывающегося списка рядом со свойством Condition и выбора в нем варианта Code Condition (Кодовое условие), а затем ввода имени того метода, который должен использоваться для вычисления этого условия во время выполнения. Это приводит к генерации лежащего в основе кода метода, как показано ниже:

private void NotFinished(object sender, ConditionalEventArgs e)

e.Result = howManyTimes++ < 5;

Этому методу передается параметр ConditionalEventArgs, который используется для возврата WhileActivity значения true или false. Возврат для свойства Result объекта ConditionalEventArgs значения true приводит к продолжению прогона цикла, а значения false - к выходу из него. В предыдущем коде предполагается наличие целочисленной переменной howManyTimes, которая используется для отсчиты-вания пяти итераций.

Определять условие декларативным образом можно путем выбора из раскрывающегося списка рядом со свойством Condition элемента Declarative Rule Condition (Условие с декларативными правмами) и выполнения щелчка на кнопке с изображением троеточия (...) рядом со свойством Condition Name. Это приводит к открытию диалогового окна Select Condition (Выбор условия), которое показано на рис. 36.7 и позволяет определять условие на базе свойств текущего рабочего потока.



Select Cond tion

Select а rule condition to be eswgned to the ectivityi condition. You can also add, edit, delete cx rename existing conditions

Condition Preview

Cancel

Puc. 36.7. Диалоговое окно Select Condition

Создание нового условия осуществляется щелчком на кнопке New (Создать) для открытия диалогового окна Rule Condition Editor (Редактор условия с декларативными правилами) и ввода желаемого условия, как показано на рис. 36.8.

Rule Сопс 11юп Ес ог

Edit constraints to create a rule condition. Ejiampie this-Propl == Yes th.s.Prop2 = =2

Condition;

jthif LoopCount < 5

Canal

Puc. 36.8. Диалоговое сукно Rule Condition Editor

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

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



1 ... 384 385 386 [ 387 ] 388 389 390 ... 396

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика