ICalcAlgorithm.CalculateAsync

Синтаксис

CalculateAsync([Callback: ICalcEtlCallback = Null;] [Objs: ICalcObjectsList = Null]): IAlgorithmCalculationAsyncResult;

Отсутствует;

Параметры

Callback. Объект, реализующий обратную связь;

Objs. Список объектов алгоритма расчёта.

Примечание. Список объектов алгоритма расчёта должен быть скопированным. Для копирования объектов используйте метод ICalcObjectsList.Clone.

Описание

Метод CalculateAsync выполняет асинхронный расчёт алгоритма.

Комментарии

В процессе выполнения асинхронного расчёта алгоритма должен использоваться режим ожидания для выявления ошибок, возникших при расчёте, и проверки завершения расчёта.

Режим ожидания реализован функцией GetState:

Function GetState(CalcResult: IAlgorithmCalculationAsyncResult): CalculateState;
Var
    State: CalculateState;
    i: Integer = 
1000;
Begin
    
// Проверим состояние расчёта
    If CalcResult <> Null Then
        State := CalcResult.State;
        
While 
            (State <> CalculateState.PausedOnDebug) 
And
            (State <> CalculateState.PausedOnError) 
And 
            (State <> CalculateState.Aborted) 
And 
            (State <> CalculateState.Stoped) 
Do
            State := CalcResult.State;
        
End While;
    
End If;
    
While i > 0 Do
        i := i - 
1;
    
End While;
    
Return State;
End Function GetState;

Пример

Для выполнения примера предполагается наличие в репозитории алгоритма расчёта с идентификатором ALGORITHM, в котором содержатся хотя бы два объекта для расчёта.

Добавьте ссылки на системные сборки: Algo, Metabase. Также добавьте ссылки на сборки, которые необходимы для работы с алгоритмами расчёта.

Sub UserProc;
Var
    MB: IMetabase;
    MObj: IMetabaseObjectDescriptor;
    Algo: ICalcObject;
    ObjList, CloneList: ICalcObjectsList;
    CalcAlgo: ICalcAlgorithm;
    CalcResult: IAlgorithmCalculationAsyncResult;
    ErrEvent: IAlgorithmCalculateErrorEvent;
    i: Integer;
Begin
    MB := MetabaseClass.Active;
    
// Получим алгоритм расчёта
    MObj := MB.ItemById("ALGORITHM");
    Algo := CalcObjectFactory.CreateCalcObject(MObj, 
True);
    CalcAlgo := Algo 
As ICalcAlgorithm;
    
// Получим список объектов алгоритма расчёта
    ObjList := CalcAlgo.Items;
    
// Скопируем список объектов алгоритма расчёта
    CloneList := ObjList.Clone;
    
// Удалим исключенные объекты перед расчётом
    For i := CloneList.Count - 1 To 0 Step - 1 Do
        
If Not CalcAlgo.Included(CloneList.Item(i)) Then
            CloneList.Remove(CloneList.Item(i));
        
End If;
    
End For;
    
// Выведем в консоль количество включенных объектов в расчёт алгоритма
    Debug.WriteLine("Количество объектов: " + CloneList.Count.ToString);
    
// Выполним асинхронный расчёт алгоритма
    CalcResult := CalcAlgo.CalculateAsync(Null, CloneList);
    
// Проверим возникновение ошибки при расчёте
    If GetState(CalcResult) = CalculateState.PausedOnError Then
        ErrEvent := CalcResult.ErrorEvent;
        
If ErrEvent <> Null Then
            
// При возникновении ошибки выведем в консоль информацию о ней
            Debug.WriteLine(ErrEvent.Message);
            
// Пропустим возникшую ошибку и продолжим расчёт
            ErrEvent.ErrorState := SkipErrorState.IgnoreAll;
        
End If;
    
End If;
    
// Проверим завершение расчёта алгоритма
    If GetState(CalcResult) = CalculateState.Stoped Then
        
// Выведем в консоль сообщение о завершении расчёта алгоритма
        Debug.WriteLine("Расчёт алгоритма завершен");
    
End If; 
End Sub UserProc;

Function GetState(CalcResult: IAlgorithmCalculationAsyncResult): CalculateState;
Var
    State: CalculateState;
    i: Integer = 
1000;
Begin
    
// Проверим состояние расчёта
    If CalcResult <> Null Then
        State := CalcResult.State;
        
While 
            (State <> CalculateState.PausedOnDebug) 
And
            (State <> CalculateState.PausedOnError) 
And 
            (State <> CalculateState.Aborted) 
And 
            (State <> CalculateState.Stoped) 
Do
            State := CalcResult.State;
        
End While;
    
End If;
    
While i > 0 Do
        i := i - 
1;
    
End While;
    
Return State;
End Function GetState;

Не предусмотрен.

В результате выполнения примера будет произведен асинхронный расчёт алгоритма. В консоль будет выведено количество рассчитанных объектов и сообщение о завершении расчёта, например:

Количество объектов: 3

Расчёт алгоритма завершен

См. также:

ICalcAlgorithm