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

Содержание:

Синхронные операции. Отображение хода процесса.

Способ мониторинга выполнения синхронной Управляемой Операции определяется вызовом одного из следующих методов класса SyncManagedOperationHelper:

Второй параметр этих методов определяет способ закрытия View по завершении процесса.

true - View закроется автоматически

false - View будет ожидать действий пользователя.

Замечание:

Мониторинг выполнения синхронной Управляемой Операции в Web-приложении имеет один нюанс. В правом верхнем углу Popup окна присутствует кнопка "Закрыть", которая закроет окно, но никак не повлияет на выполнение процесса. Такое поведение некорректно, т.к. для прерывания процесса есть специальная кнопка, а других вариантов выхода из операции быть не должно. Чтобы убрать кнопку "Закрыть" из Popup окна, есть 2 способа:

Реализуйте интерфейс IXafPopupWindowControlHolder для класса страницы. По умолчанию это можно сделать с файле Default.aspx.cs.

Альтернативный вариант: измените свойство ID для XafPopupWindowControl в вашем приложении, установите значение "PopupWindowControl". Если приложение создано через шаблон VS, то "PopupWindowControl" является значением по умолчанию.

Создание асинхронных операций.

Чтобы реализовать асинхронную Управляемую Операцию требуется создать объект класса Managed Operations также, как это описано в статьях Начало работы и Пример управляемой операции с подпроцессами. Созданная  операция по умолчанию будет выполняться асинхронно, если не обращаться к классу SyncManagedOperationHelper.

Примеры асинхронных Управляемых Операций включены в демо-приложение Xafari Northwind.

Код этих примеров можно найти в файле ManagedOperationsWindowController.cs демо-приложения Xafari Northwind, установленного вместе с Xafari.

Логирование управляемых операций

Логирование позволяет сохранить историю выполнения управляемых операций для последующего просмотра и анализа. Занесение  информации в лог (с индикатором процента выполнения) осуществляется методом NextStep(string message, int message, int message). Для сохранения только сообщений (без прогресса) используется метод NextStep(string message).

Настройка параметров логирования производится при инициализации операции. Для управления механизмом логирования применяются следующие параметры:

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

 

private void SyncProgress_Execute(object sender, SimpleActionExecuteEventArgs e)

{

 var operation = new Operation1(this.Application);

 var mo = new ManagedOperation(this.Application)

 {

         ZoneType = ((ActionBase)sender).Id == "SyncLocalProgress" ? ManagedOperationZoneTypes.Local :ManagedOperationZoneTypes.Global,

         Name = "SyncProgress",

         ProcessCode = (operation.Stage2),

         TotalStep = operation.Count,

 

                   Split = false,

               Interval = 2000,

       };

  mo.Start();

  SyncManagedOperationHelper.CreateHelper(mo).InitShowViewParametersProgress(e.ShowViewParameters, false);

}

 

Пример кода, для разбиения лога на части:

 

              //...

 

              Split = true,              

              Count = 12,

              Interval = 2000,

 

              //...

 

Окно лога для первого и второго вариантов выглядит следующим образом:

Win:

Если в результате выполнения Управляемой Операции возникли предупреждения либо ошибки, то логирование происходит следующим образом: если в блоке возникло предупреждение, то весь блок помечается типом TraceMessageTypes.Warning. При ошибке весь блок помечается типом TraceMessageTypes.Error. Если в одном блоке возникли и предупреждения и ошибки, тогда он помечается TraceMessageTypes.ErrorAndWarning.

Настройка уровней критичности для логирования

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

Свойство TraceLevel определяет, какое сообщение попадет в лог. TraceLevel может принимать следующие значения: Off, Errors, Warnings, Info, Verbose. Эти значения входят в перечисление System.Diagnostics.TraceLevel.

В случае длительных операций значения Info и Verbose имеют одинаковый смысл – будет записываться вся информация о ходе выполнения. Errors – будут сохраняться только ошибки, Warnings – ошибки и предупреждения. Если выбран Off, то кнопка открытия протокола на форме будет недоступна.

Настройка уровней критичности осуществляется:

Настройка уровня критичности с помощью .config файла осуществляется через переменную

 

<system.diagnostics>

<switches>

<!-- 0-Off, 1-Errors, 2-Warnings, 3-Info, 4-Verbose. -->

<add name="eXpressAppFramework" value="3" />                                      </switches>

</system.diagnostics>

 

Для каждой операции можно вручную задать желаемый уровень критичности. Это делается при объявлении операции:

 

                 var mo = new ManagedOperation(this.Application)

                 {

                         ZoneType = ((ActionBase)sender).Id == "SyncLocalSubWithExceptions" ? ManagedOperationZoneTypes.Local : ManagedOperationZoneTypes.Global,

                         Name = "Синхронный длительный процесс с подпроцессами с исключениями",

               TracingStrategy = TracingStrategy.CopyToParent,

               TraceLevel = TraceLevel.Error,

                 };

 

Если уровень задан явно при создании управляемой операции, то именно он, а не значение из .config файла будет использован при логировании процесса.

Уникальные операции

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

Чтобы получить пример уникальной операции, следует модифицировать код метода StartSimpleOperation_Execute() из Управляемые операции. Начало работы следующим образом:

 

      private void StartSimpleOperation_Execute(object sender, SimpleActionExecuteEventArgs e)

       {

 

              var simpleOperation = new SimpleOperation(this.Application);

              var operationId = new Guid("DCEDA7A6-B8E2-4306-AB52-0B0220C826CD");

 

              var managedOperation = new ManagedOperation(this.Application, operationId)

               {

                   ZoneType = ManagedOperationZoneTypes.Local,

                   Name = "Managed operation ",

                   ProcessCode = (simpleOperation.ExecuteCore),                  

               };

 

               managedOperation.Start(false);

       }

 

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

При попытке повторного запуска возникнет простое уведомление либо подробное сообщение о недопустимости запуска.

Простое уведомление будет отображено, если метод start() вызван с параметром false. В противном случае пользователь увидит окно исключения.

Пример создания уникальной операции можно найти в файле ManagedOperationsWindowController.cs (ASyncUnique_Execute() method) демо-приложения Xafari Northwind, установленного вместе с Xafari.

Локальные и глобальные операции

Стратегия хранения данных о выполнении Управляемой Операции определяется свойством ManagedOperation.ZoneType. Если при инициализации указать ZoneType = ManagedOperationZoneTypes.Local, то операция будет локальной. Соответственно, при ZoneType = ManagedOperationZoneTypes.Global, будет создана глобальная Управляемая Операция.