|
Программирование >> Программирование с использованием ajax
private void codeActivityl ExecuteCode(object sender, EventArgs e) Здесь видно, что автоматически был создан метод codeActivityl ExecuteCode. Еще обратите внимание на то, что рабочий поток унаследован от класса SequentialWorkf lowActivity, а это значит, что он сам тоже является, по сути, всего лишь еще одной разновидностью действия. 4. Теперь добавьте в этот код вызов метода Console .WriteLine для вывода традиционного приветствия Hello World : private void codeActivityl ExecuteCode(object sender, EventArgs e) { Console.WriteLine( Hello World ); Скомпмируйте и запустите прможение, чтобы увидеть, как оно выведет текст на консоль. Описание полученных результатов Основная программа, созданная после того, как вы выбрали проект Sequential Workflow Console Application, представляет собой экземпляр объекта WorkflowRuntime. Этот объект координирует выполнение всех рабочих потоков и может применяться для запуска их экземпляров. В данном примере он создает экземпляр класса Workf lowl и выполняет его. Сначала исполняющая среда выполняет первое действие в рабочем потоке (каковым в данном случае является сам рабочий поток). Далее она выполняет каждое действие по очереди, в результате чего вызывается действие CodeActivity, которое, в свою очередь, выполняет метод, куда был добавлен вызов метода Console.WriteLine. По завершении выполнения рабочего потока консольное приложение закрывается. Весь код этого основного приложения показан ниже: static void Main(string[] args) { using(WorkflowRuntime WorkflowRuntime = new WorkflowRuntime ()) { AutoResetEvent waitHandle = new AutoResetEvent (false); workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set 0;}; workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set 0; Workflowlnstance instance = WorkflowRuntime.CreateWorkflow (typeof( l HelloWorld.Workflowl)); instance.Start(); waitHandle.WaitOne() ; Здесь сначала внутри блока using создается объект Workf lowRuntime и объект AutoResetEvent, который будет использоваться для подачи сигнала о создании и о завершении выполнения рабочего потока. Для обеспечения возможности ожидания таких сигналов присоединяются обработчики для, соответственно, событий WorkflowCompleted и WorkflowTerminated. Далее создается и запускается экземпляр Workf lowlnstance - делается это за счет согласования экземпляра с расписанием исполняющей среды и последующего его запуска вызовом метода Start (). Напоследок консольное приложение ожидает поступления сигнала о событии, каковым может быть либо успешное завершение выполнения рабочего потока, либо его неожиданное прерывание (т.е. генерация исключения во время выполнения какого-то из действий в рамках этого рабочего потока). Класс Workf lowRuntime еще будет рассматриваться чуть позже в этой главе. Действия Строительными блоками любого рабочего потока являются действия (да и сам рабочий поток тоже на самом деле является таковым). Каждое действие (activity) представляет собой .NET-класс, который обычно наследуется от класса System. Workf low. ComponentModel .Activity. Несколько других классов могут улучшать поведение действия, например, изменять его внешний вид на этапе проектирования или обеспечивать его верификацию на предмет определения всех обязательных свойств. Всего в составе .NET 3.5 поставляется 30 действий; в настоящем разделе будут рассмотрены некоторые из них и показано, как их использовать в приложении. Действие CodeActivity уже встречалось в настоящей главе, в частности, оно использовалось в предыдущем разделе для отображения кое-какого вывода в окне консоли. В большинстве случаев, однако, лучше создавать специальные действия, а не применять CodeActivity, поскольку их можно использовать повторно и в других рабочих потоках. Что касается действия CodeActivity, то его повторно использовать можно только при копировании файла отделенного кода. Действия в WF бывают двух видов: простые и составные. Простые действия вроде CodeActivity наследуются, как уже упоминалось, от базового класса Activity, и отображаются в визуальном конструкторе рабочего потока в виде одиночного элемента. Составные действия, в отличие от них, служат, по сути, контейнерами для других действий. Сначала в этом разделе мы рассмотрим некоторые простые действия, затем - составные, а потом покажем, как создавать свои собственные. Действие DelayActivity Действие DelayActivity может использоваться в рабочем потоке для перевода его в режим ожидания на определенный период времени. Подобное может быть удобно, например, в случае применения рабочих потоков для напоминания об обновлении страховых полисов. При получении нового полиса может запускаться рабочий поток напоминания с 11-месячной задержкой в качестве первого действия. По истечения этого периода задержки может выполняться подготовка документов на возобновление действия полиса и их автоматическая рассылка держателям страховым полисов. На рис. 36.4 показаны свойства, доступные для DelayActivity. Если требуемый период задержки известен (например, два часа), тогда можно изменять свойство TimeoutDuration и указывать время в формате {дни} ЧЧ:ММ:СС, причем часть {дни} здесь является необязательной. S qu*nti*l WorVflow 4= X deUyActMtyl Systcm.Workflow.Activities D deUyAttlvltyl Oescnptton Enabled IrwtialireTimeoutDuration TimeoutDuration Puc. 36.4. Свойства DelayActivity При выполнении действие DelayActivity, по сути, приостанавливает рабочий поток на указанный период времени и затем, по истечении этого периода задержки, возобновляет его работу со следующего действия. Длительностью периода задержки можно управлять с помощью свойства Initialize TimeoutDuration, которое привязывается к обработчику событий в файле отделенного кода. Добавляется обработчик событий двойным щелчком на DelayActivity и выглядит так, как показано ниже: private void delayActivityl InitializeTimeoutDuration (ob:)ect sender, EventArgs e) Здесь первым аргументом является DelayActivity, а это означает, что можно добавлять код, подобный показанному ниже, для инициализации свойства TimeoutDuration любым желаемым значением. В данном примере оно устанавливается равным 10 секундам: private void delayActivityl InitializeTimeoutDuration (object sender, EventArgs e) DelayActivity delay = sender as DelayActivity; if (null != delay) delay.TimeoutDuration = new TimeSpan(0, 0, 0, 10); Обратите внимание, что аргумент sender нужно обязательно приводить к типу экземпляра DelayActivity. Когда рабочий поток находится в состоянии задержки, он фактически ничего не делает: механизм таймера внутри исполняющей среды рабочего потока знает, как обращаться с задержками, и умеет пробуждать спящий поток по истечении его периода задержки. Более подробно об этом будет рассказываться позже в этой главе, в разделе Исполняющая среда рабочего потока . Действие SuspendActivity При выполнении рабочего потока может быть необходимо приостанавливать его выполнение: например, может быть нужно, чтобы в случае недоступности службы базы данных в текущий момент выполнение рабочего потока приостанавливалось до тех пор, пока эта служба не станет доступной снова. Действие приостановки (SuspendActivity), как видно на рис. 36.5, имеет свойство Error, для которого в качестве значения может устанавливаться строка с описанием причины приостановки рабочего потока.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |