|
Программирование >> Программирование с использованием ajax
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, способное обновлять это значение при каждом прохождении цикла. Код рабочего потока тогда должен выглядеть так, как показано ниже:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |