(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Обзор рабочего потока Windows Workflow. Часть 4

Источник: rsdn

Читать часть 3

Возврат результатов из рабочего потока Visual Studio 

Другим распространенным требованием, предъявляемым к рабочему потоку, является возврат выходных параметров - может быть, тех, что будут как-то использованы, а затем записаны в базу данных или другое постоянное хранилище.

Поскольку рабочий поток выполняется исполняющей средой рабочего потока, вы не можете просто так вызвать рабочий поток, используя стандартный вызов метода - вы должны создать экземпляр рабочего потока, запустить его и затем ожидать завершения этого экземпляра. Когда рабочий поток завершается, исполняющая система рабочего потока возбуждает событие WorkflowCompleted. Оно сопровождается контекстной информацией о рабочем потоке, который только что завершился, и содержит выходные данные этого потока.

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

using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
   AutoResetEvent waitHandle = new AutoResetEvent(false);
   workflowRuntime.WorkflowCompleted +=
      delegate(object sender, WorkflowCompletedEventArgs e)
      {
         waitHandle.Set();
         foreach (KeyValuePair<string, object> parm in e.OutputParameters)
         {
            Console.WriteLine("{0} = {1}", parm.Key, parm.Value);
         }
      };
   WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1));
   instance.Start();
   waitHandle.WaitOne();
}

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

Привязка параметров к действиям

Теперь, когда вы узнали, как передавать параметры в рабочий поток, вам также понадобится посмотреть, как связать эти параметры с действиями. Это делается с помощью механизма, называемого привязкой (binding). В ранее определенном DaysOfWeekActivity имеется свойство Date, которое, как упоминалось ранее, может быть жестко закодировано либо привязано с другому значению внутри рабочего потока. Привязываемое свойство отображается в таблице свойств, в среде Visual Studio , как показано на рис. 41.17. Наличие пиктограммы синего цвета рядом с именем свойства говорит о том, что это привязываемое свойство.


Рис. 41.17. Привязываемое свойство

Двойной щелчок на пиктограмме привязкивызовет диалог, показанный на рис. 41.18. Этот диалог позволит выбрать соответствующее свойство для привязки свойства Date.

На рис. 41.18 выбрано свойство OrderDate рабочего потока (которое определено как обычное свойство .NET, как было показано ранее в одном из предыдущих фрагментов кода). Всякое привязываемое свойство может быть привязано либо к свойству рабочего потока, внутри которого определено действие, либо к свойству любого действия, относящегося к рабочему потоку, которое находится выше текущего действия.


Рис. 41.18. Диалоговое окно, отображаемое в результате двойного щелчка на пиктограмме привязки

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

Мы повторим код свойства Date, чтобы показать, как работает привязка, а объяснения вы найдете в следующем абзаце.

public DateTime Date
{
   get { return (DateTime)base.GetValue(DaysOfWeekActivity.DateProperty); }
   set { base.SetValue(DaysOfWeekActivity.DateProperty, value); }
}

Когда вы привязываете свойство в рабочем потоке, то "за кулисами" конструируется объект типа ActivityBind, и это и будет тем "значением", которое сохраняется внутри свойства зависимости. Поэтому средству set свойства будет передан объект типа ActivityBind, и он будет сохранен внутри словаря свойств для данного действия. Объект ActivityBind состоит из данных, описывающих действие, к которому выполняется привязка, и свойства данного действия, которое будет использовано во время выполнения.

При чтении значения свойства вызывается метод GetValue объекта DependencyObject, и этот метод проверяет значение лежащего в основе свойства на предмет того, является ли оно объектом ActivityBind. Если это так, затем разрешается действие, к которому выполняется привязка, а затем читается реальное значение свойства из этого действия. Однако если привязанное значение имеет другой тип, тогда просто возвращается объект из метода GetValue().

Исполняющая среда рабочего потока

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

Когда вы запускаете исполняющую систему, она перезагружает все экземпляры рабочих потоков, которые существовали на момент последнего запуска приложения, посредством чтения этих экземпляров из постоянного хранилища. Здесь используется служба, называемая службой постоянства (persistence service), которую мы определим ниже.

Исполняющая система содержит методы для конструирования экземпляров рабочих потоков - имеются шесть разных методов CreateWorkflow, которые могут быть использованы для этого, а кроме этого, исполняющая система также содержит методы для перезагрузки экземпляров и перечисления всех работающих экземпляров.

Исполняющая система также поддерживает ряд событий, которые возбуждаются на протяжении жизни рабочего потока, такие как WorkflowCreated (возбуждается, когда конструируется новый экземпляр рабочего потока), WorkflowIdled (возбуждается, когда рабочий поток ожидает ввода, как в приведенном ранее примере обработки отчетов о расходах) и WorkflowCompleted (возбуждается при завершении рабочего потока).

Службы рабочих потоков

Рабочий поток не существует сам по себе. Как показано в предыдущих разделах, рабочий поток выполняется внутри WorkflowRuntime, и эта исполняющая система предоставляет службы запущенным рабочим потокам.

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

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

Когда выполняется действие, ему передается некоторая контекстная информация в параметре ActivityExecutionStatus метода Execute.

protected override ActivityExecutionStatus Execute
(ActivityExecutionContext executionContext)
{
...
}

Одним из доступных методов в этом контекстном параметре является GetService<T>. Как показано в следующем коде, он может использоваться для доступа к службе, прикрепленной к исполняющей среде рабочего потока Visual Studio .

protected override ActivityExecutionStatus Execute
(ActivityExecutionContext executionContext)
{
    ICustomService myService = executionContext.GetService<ICustomService>();
... //Делать что-нибудь со службой
}

Службы, развернутые в исполняющей среде, добавляются в нее до вызова метода StartRuntime; если вы попытаетесь добавить службу к исполняющей среде после ее запуска, то получите исключение.

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

В следующем фрагменте кода показано, как добавлять службы во время выполнения в коде. Добавляемые службы описаны ниже в этом разделе.

using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
   workflowRuntime.AddService(
      new SqlWorkflowPersistenceService(conn, true, new TimeSpan(1,0,0),
      new TimeSpan(0,10,0)));
   workflowRuntime.AddService(new SqlTrackingService(conn));
...
}

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

Чтобы создать службы с помощью конфигурационного файла приложения, нужно добавить соответствующий раздел-обработчик для исполняющей среды рабочего потока, после чего добавить службы в этот раздел:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <configSections>
      <section name="WF"
      type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection,
      System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral,
      PublicKeyToken=31bf3856ad364e35" />
   </configSections>
   <WF Name="Hosting">
      <CommonParameters/>
      <Services>
         <add type="System.Workflow.Runtime.Hosting.
                    SqlWorkflowPersistenceService,
                    System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral,
                    PublicKeyToken=31bf3856ad364e35"
              connectionString="Initial Catalog=WF;Data Source=.;
                                Integrated Security=SSPI;"
              UnloadOnIdle="true"
              LoadIntervalSeconds="2"/>
         <add type="System.Workflow.Runtime.Tracking.SqlTrackingService,
                    System.Workflow.Runtime, Version=3.0.00000.0,
                    Culture=neutral,
                    PublicKeyToken=31bf3856ad364e35"
              connectionString="Initial Catalog=WF;Data Source=.;
                                Integrated Security=SSPI;"
              UseDefaultProfile="true"/>
      </Services>
   </WF>
</configuration>

Внутри конфигурационного файла вы добавляете обработчик секции WF (имя не имеет значения, но должно совпадать с именем, приведенным ниже в секции конфигурации), а затем создаете соответствующие элементы для этого раздела. Элемент <Services> может содержать произвольный список элементов, состоящих из типа .NET и параметров, передаваемых службе при ее конструировании исполняющей средой. Для чтения настроек из файла конфигурации приложения во время выполнения вызывается другой конструктор, как показано ниже:

using(WorkflowRuntime workflowRuntime = new WorkflowRuntime("WF"))
{
...
}

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

Читать часть 5

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 24.03.2010 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft Office для дома и учебы 2019 (лицензия ESD)
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год.
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год.
Microsoft 365 Apps for business (corporate)
Microsoft Office 365 Профессиональный Плюс. Подписка на 1 рабочее место на 1 год
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Компьютерные книги. Рецензии и отзывы
ЕRP-Форум. Творческие дискуссии о системах автоматизации
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100