Огляд робочого потоку Windows Workflow. Частина 4, Різне, Програмування, статті

Читати частина 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 . Як показано в наступному коді, він може використовуватися для доступу до служби, прикріпленою до виконуючою середовищі робочого потоку 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 (ім’я не має значення, але має збігатися з ім’ям, наведеним нижче в секції конфігурації), а потім створюєте відповідні елементи для цього розділу. Елемент може містити довільний список елементів, що складаються з типу. NET і параметрів, переданих службі при її конструюванні виконуючою середовищем. Для читання налаштувань з файлу конфігурації програми під час виконання викликається інший конструктор, як показано нижче:





using(WorkflowRuntime workflowRuntime = new WorkflowRuntime(“WF”))
{

}

Цей конструктор створює екземпляри кожної служби, визначеної всередині конфігураційного файлу, і додає їх в колекцію служб під час виконання. У наступному розділі розглядаються деякі стандартні служби, доступні в WF.

Читати частина 5

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*