Управляемые операции

[vc_row][vc_column][vc_column_text]

Общие сведения

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

Управление операциями осуществляется при помощи спискового представления Управляемые операции. Если операция находится в состоянии Создана (Created) или Выполняется (Running), ее можно приостановить или прервать (завершить аварийно). Если операция находится в состоянии Приостановлена (Suspended), ее можно продолжить или прервать. Для операций в состоянии Прервана (Cancelled), или Завершена (Completed), действия по управлению недоступны.
Некоторые операции выполняются локально (на клиентском компьютере), в БД сведений об их выполнении нет. Следует учесть, что при завершении приложения информация об текущих локальных операциях теряется.

ListView Управляемые операции в Win-приложении

ListView Управляемые операции в Win-приложении

ListView Управляемые операции в Web-приложении

ListView Управляемые операции в Web-приложении

 

 

 

 

Асинхронная операция

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

[vc_video ratio="16-9" link="http://www.youtube.com/watch?v=9V--lKGGIDg&feature=player_embedded"]
[vc_video ratio="16-9" link="http://www.youtube.com/watch?feature=player_detailpage&v=YRaVfml0jmE"]

Асинхронная операция с подпроцессами

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

[vc_video ratio="16-9" link="http://www.youtube.com/watch?feature=player_embedded&v=QQI_mQ6hdo8"]
[vc_video ratio="16-9" link="http://www.youtube.com/watch?feature=player_detailpage&v=otHMHn9aJ1c"]

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

Для некоторых операций должна обеспечиваться уникальность исполнения в рамках БД. Например, не может одновременно исполняться два процесса пересчета плана или расчета зарплаты (в каждый момент времени может быть запущен только одним пользователем, только один раз). Уникальность реализована как запрет создания экземпляра при наличии исполняющейся операции.

[vc_video ratio="16-9" link="http://www.youtube.com/watch?v=jlNsnJ_zAYA&feature=player_detailpage"]
[vc_video ratio="16-9" link="http://www.youtube.com/watch?feature=player_detailpage&v=9nSt2Dbde7k"]

Синхронная операция

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

[vc_video ratio="16-9" link="http://www.youtube.com/watch?v=e7HMG6AkWtA&feature=player_detailpage"]
[vc_video ratio="16-9" link="http://www.youtube.com/watch?v=zXiA8Z2q9zE&feature=player_embedded"]

Примеры использования

Асинхронная операция

Рассмотрим пример операции, выводящей сообщение об этапе выполнения 10 раз через 5 сек. Установим ссылки на сборки:

  1. System.Threading
  2. DevExpress.ExpressApp
  3. Xafari.ManagedOperations

В конструкторе создадим объект Process типа ManagedOperation и назначим свойству ProcessCode метод Stage1(IManagedOperation operation), который реализует заданный алгоритм. В конструктор объекта ManagedOperation передается параметр типа XafApplication.

[code]
public class Operation2
{
private ManagedOperation Process { get; set; }
public int Count { get; set; }
public int Timeout { get; set; }
public Operation2(XafApplication application)
{
this.Process = new ManagedOperation(application)
{
Name = "Длительая операция c прогрессом",
ProcessCode = (item => this.Stage1(item)),
};
Count = 10;
Timeout = 5;
this.Process.TotalStep = Count;
}
public void Run()
{
this.Process.Start();
}
void Stage1(IManagedOperation operation)
{
for (int i = 0; i < Count; i++)
{
operation.NextStep(string.Format("{0}-й этап", i), i, Count);
Thread.Sleep(Timeout * 1000);
}
}
}
[/code]

Занесение информации в лог (с индикатором процента выполнения) осуществляется методом:
NextStep (string message, int message, int message)
. Для сохранения только сообщений (без прогресса) используется метод: NextStep (string message). Вызов операции для Win-платформы осуществляется Действием (SimpleAction), добавляемым в контроллер (см. Add simple Action). Назовем его Operation2Start.

[code]
private void simpleAction_Execute(object sender, SimpleActionExecuteEventArgs e)
{
new Operation2(this.Application).Run();
}
[/code]

Асинхронная операция с подпроцессами

Отличие от Operation2 только в конструкторе операции, в котором создадим подпроцессы. Для создания подпроцессов воспользуемся методом класса ManagedOperation CreateSubProcess(string name,Action action).

[code]
public Operation3(XafApplication app)
{
Process = new ManagedOperation(app)
{ Name = "Операция с подпроцессами"};
Process.CreateSubProcess("Подпроцесс 1", item => this.Stage1(item));
Process.CreateSubProcess("Подпроцесс 2", item => this.Stage1(item));
Process.CreateSubProcess("Подпроцесс 3", item => this.Stage1(item));
Process.CreateSubProcess("Подпроцесс 4", item => this.Stage1(item));
Process.CreateSubProcess("Подпроцесс 5", item => this.Stage1(item));
Count = 5;
Timeout = 2;
}
[/code]

Вызов операции на выполнение аналогичен:
new Operation3(this.Application).Run();
Добавим в контроллер Действие (см п.2) и назовем Operation3Start.

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

Для некоторых операций должна обеспечиваться уникальность исполнения в рамках БД. Например, не может одновременно исполняться два процесса пересчета плана или расчета зарплаты (в каждый момент времени может быть запущен только одним пользователем, только один раз). Уникальность реализована как запрет создания экземпляра при наличии исполняющейся операции.
Рассмотрим пример такой операции. Исходный код аналогичен рассмотренным выше примерам. Изменение – в конструкторе. В нем создаем объект ManagedOperation при помощи конструктора с двумя параметрами, вторым является уникальный идентификатор.

[code]
public UniqueOperation1(XafApplication application)
{
var g = new Guid("DCEDA7A6-B8E2-4306-AB52-0B0220C826CD");
Process = new ManagedOperation(application, g)
{
Name = "Уникальнаый процесс с подпроцессами"
};
Process.CreateSubProcess("Подпроцесс 1", item => this.Stage1(item));
Process.CreateSubProcess("Подпроцесс 2", item => this.Stage1(item));
Process.CreateSubProcess("Подпроцесс 3", item => this.Stage1(item));
Process.CreateSubProcess("Подпроцесс 4", item => this.Stage1(item));
Process.CreateSubProcess("Подпроцесс 5", item => this.Stage1(item));
Count = 5;
Timeout = 1;
}
[/code]

При создании экземпляра задается идентификатор операции типа Guid. При попытке создания объекта ManagedOperation, проверяется наличие выполняемой операции с таким же идентификатором. Если таковая найдена, то генерится исключение и выводится сообщение:

Синхронная операция

Некоторые операции запускаются синхронно, то есть для продолжения работы и выполнения любых действий в клиентском приложении необходимо начала дождаться окончания запущенной операции; допустим только мониторинг процесса. Для запуска такой операции добавим два действия: одно для операции с неизвестным количеством шагов («крутелка»), а другое - для операции с конечным количеством шагов («прогресс»). В обработчике обытия Execute для первого действия напишем код

[code lang="csharp"]

[/code]

Для задания визульного представления бесконечного цикла в метод InitShowViewParametersForSyncOperation(ManagedOperation operation, ShowViewParameters parameters, bool isProgress) передается параметр false.

В обработчике события Execute для второго действия напишем код:

[code]
private void simpleAction4_Execute(object sender, SimpleActionExecuteEventArgs e)
{
var mo = new ManagedOperation(this.Application)
{
IsLocal = true,
Name = "Синхронный длительный процесс Progress",
ProcessCode = (item => new
Operation1(this.Application).Stage1(item)),
};
mo.Start();
SyncManagedOperationDialogController.
InitShowViewParametersForSyncOperation(mo, e.ShowViewParameters, true);
}
[/code]

Для задания визульного представления пошагового индикатора процесса в метод InitShowViewParametersForSyncOperation(ManagedOperation operation, ShowViewParameters parameters, bool isProgress) передается параметр true.[/vc_column_text][/vc_column][/vc_row]