Реализация обработки длительной операции в задаче
Для обработки длительных операций в системе, когда использование блока "Скрипт" приводит к таймауту и срыву процесса, можно использовать следующий метод. При этом в самой задаче будет отображаться прогресс обработки, на время обработки кнопки переходов будут скрыты.
Внутри обработчика нельзя использовать context. Вместо этого использовать model.Context.
public override void OnTaskCreate(ITaskBase task, P_IA_AandP context)
{
// 4f55dd98-5242-4633-88e8-4c745551b52c - Id задачи на диаграмме
WorkflowHelper.ProcessLongAction(new Guid("4f55dd98-5242-4633-88e8-4c745551b52c"), task, (model, session) =>
{
model.Name = "Сбор данных по активным задачам"; // Название операции, отображаемое в задаче
// Здесь любой код для длительных операций
var instanceContext = model.Context as P_IA_AandP;
});
}
В ELMA4 изменена сигнатура вызова метода - дополнительно передается тип контекста:
public override void OnTaskCreate(ITaskBase task, P_IA_AandP context)
{
// 4f55dd98-5242-4633-88e8-4c745551b52c - Id задачи на диаграмме
WorkflowHelper.ProcessLongAction<P_IA_AandP>(new Guid("4f55dd98-5242-4633-88e8-4c745551b52c"), task, (model, session) =>
{
model.Name = "Сбор данных по активным задачам"; // Название операции, отображаемое в задаче
// Здесь любой код для длительных операций
var instanceContextVar1 = model.Context.Var1;
});
}
После окончания длительной операции контекст процесса сохранять не нужно - это будет сделано автоматически, если были изменения.
В результате при создании задачи запуститься в отдельном потоке обработка, кнопки переходов будут скрыты и будет отображена информация об операции со счетчиком времени выполнения. Например:
После завершения длительно операции кнопки переходов вновь появятся и будет выдано сообщение со временем завершения выполнения указанной операции:
Если в исполняемом коде будет вызвано исключение, то появится соответствующее сообщение, кнопки переходов так же появятся: