Как создать и запустить длительно выполняющийся рабочий процесс
Данный раздел относится к версии Windows Workflow Foundation 4.
Одной из основных особенностей Windows Workflow Foundation (WF) является поддержка средой выполнения сохранения и выгрузки бездействующих рабочих процессов в базу данных. В этом разделе описываются способы создания локальной базы данных для сохранения рабочих процессов и включения сохраняемости в приложении рабочего процесса.
Примечание |
---|
Каждый раздел в учебнике «Приступая к работе» построен на основе предыдущих разделов. Для изучения этого раздела необходимо сначала ознакомиться с разделами Как создать действие, Как создать рабочий процесс и Как запустить рабочий процесс. |
Создание базы данных сохраняемости
Откройте среду SQL Server Management Studio и подключитесь к локальному серверу. Щелкните правой кнопкой мыши узел Базы данных на локальном сервере и выберите пункт Создать базу данных. Задайте для новой базы данных имя Persistence, примите все остальные значения и нажмите кнопку ОК.
Примечание Перед созданием новой базы данных следует удостовериться в наличии разрешения Create Database на локальном сервере. Щелкните правой кнопкой мыши новую базу данных Persistence и выберите Создать запрос. Откройте следующую папку: C:\Windows\Microsoft.NET\Framework\<текущая версия>\sql\en. Перетащите в окно запроса следующие файлы и запустите их в следующем порядке:
SqlWorkflowInstanceStoreSchema.sql
SqlWorkflowInstanceStoreLogic.sql
Включение сохраняемости в приложении рабочего процесса
Щелкните правой кнопкой мыши WorkflowConsoleApplication1 в Обозревателе решений, а затем выберите команду Добавить ссылку.
Выберите System.ActivitiesDurableInstancing и System.Runtime.DurableInstancing на вкладке .NET и нажмите кнопку ОК.
Откройте файл Program.cs (Module1.vb в Visual Basic) в проекте WorkflowConsoleApplication1. В классе
Program
(Module1
в Visual Basic) объявите строковую константу, которая определяет строку соединения с базой данных сохраняемости, созданной в первой процедуре.Const connectionString As String = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI"
const string connectionString = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI";
Примечание В строке подключения могут указываться различные имена серверов в зависимости от выпуска SQL Server. Затем добавьте инструкцию using или Imports для
System.Activities.DurableInstancing
в файл Program.cs или Module1.vb.Imports System.Activities.DurableInstancing
using System.Activities.DurableInstancing;
В методе
Main
после кода, создаваемого WorkflowApplication, создайте SqlWorkflowInstanceStore и назначьте его InstanceStore для приложения WorkflowApplication.Dim inputs As New Dictionary(Of String, Object) inputs.Add("MaxNumber", 100) Dim wfApp As New WorkflowApplication(New Workflow1(), inputs) Dim store As New SqlWorkflowInstanceStore(connectionString) wfApp.InstanceStore = store
WorkflowApplication wfApp = new WorkflowApplication(new Workflow1(), inputs); SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString); wfApp.InstanceStore = store;
Затем укажите для рабочего процесса сохранение в случае перехода в режим бездействия. Для этого замените делегат события
Idle
, который был добавлен в предыдущем разделе, следующим кодом, который обрабатывает PersistableIdle.' Replace the Idle handler with a PersistableIdle handler. 'wfApp.Idle = _ ' Sub(e As WorkflowApplicationIdleEventArgs) ' idleEvent.Set() ' End Sub wfApp.PersistableIdle = _ Function(e As WorkflowApplicationIdleEventArgs) idleEvent.Set() Return PersistableIdleAction.Persist End Function
// Replace the Idle handler with a PersistableIdle handler. //wfApp.Idle = delegate(WorkflowApplicationIdleEventArgs e) //{ // idleEvent.Set(); //}; wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) { idleEvent.Set(); return PersistableIdleAction.Persist; };
Примечание Перечисление PersistableIdleAction имеет три значения: None, Persist и Unload. Persist инициирует сохранение рабочего процесса, но не вызывает выгрузку рабочего процесса. Unload инициирует сохранение и выгрузку рабочего процесса. После выгрузки экземпляра WorkflowApplication удаляется, а для следующего сеанса взаимодействия с выгруженным рабочим процессом требуется объект WorkflowApplication. В этом разделе Persist
используется таким образом, что рабочий процесс остается в памяти и WorkflowApplication не удаляется. Образец Сохранение приложения рабочего процесса можно рассматривать как пример использования WorkflowApplication со значением перечисления Unload.В конце метода
Main
добавьте следующие строки кода. WorkflowApplication автоматически выгрузит экземпляр рабочего процесса из памяти после завершения игры и удалит запись сохраняемости из базы данных.Console.WriteLine("Press any key to continue . . .") Console.ReadKey()
Console.WriteLine("Press any key to continue . . ."); Console.ReadKey();
Примечание После завершения рабочего процесса выполняется удаление записи сохраняемости рабочего процесса. В данном примере, когда Console.ReadKey не используется, ведущее приложение выполнит выход сразу же по завершении рабочего процесса. Очистка записей сохраняемости выполняется в фоновом потоке и поэтому не может завершиться в случае, если ведущее приложение преждевременно завершает работу. Немедленное завершение работы ведущего предложения до завершения операции сохраняемости можно также предотвратить, заблокировав ведущее приложение до возникновения события Unloaded после завершения рабочего процесса. После завершения рабочего процесса его выгрузка не будет выполнена до завершения фоновой работы, например удаления завершенного рабочего процесса из сохраняемости. Чтобы выполнить проверку сохраняемости, нажмите клавишу F5 для запуска приложения и переключитесь обратно в среду SQL Server Management Studio. Разверните узел базы данных Persistence (или узел базы данных Master, если таблицы сохраняемости были созданы в базе данных «Master») и узел Tables в базе данных Persistence. Щелкните правой кнопкой мыши таблицу InstancesTable и выберите Выделить 1000 верхних строк. Должна отобразиться одна строка с идентификатором сохраненного рабочего процесса.
Затем завершите игру, чтобы завершить рабочий процесс. После завершения игры вернитесь в среду SQL Server Management Studio и повторно выполните запрос. Обратите внимание, что записи сохраняемости возвращены не будут.
Учебник «Приступая к работе» завершен.