<< Click to Display Table of Contents >> Разработка > Рекомендации по разработке для масштабируемых систем > Оптимизация работы с сущностями Оптимизация события «Возможность выполнения» (CanExecute) |
По умолчанию в системе оптимизировано вычисление события Возможность выполнения (CanExecute) для системных действий, которые доступны в дочерней коллекции: Копирование строки (CopyChildEntity), Удаление строки (DeleteChildEntity) и Добавление строки (AddChildEntity). Оптимизация заключается в том, что возможность выполнения действия проверяется один раз для всей коллекции, а не вызывается многократно для каждой записи. Это позволяет ускорить работу с карточками объектов, у которых в табличной части большое количество записей. Например, когда в карточке роли указано более тысячи участников.
В среде разработки новые действия для дочерних коллекций по умолчанию создаются с учетом оптимизации. Для этого в редакторе типа сущности автоматически устанавливается флажок Проверять возможность выполнения один раз для коллекции для действий, у которых в поле *Доступно в выбрано значение Дочерней коллекции:
Снимите этот флажок, если событие Возможность выполнения (CanExecute) нового действия все же необходимо вычислять отдельно для каждого элемента коллекции. Например, в системе для действий коллекции версий документа флажок снят. Возможность выполнения проверяется отдельно для каждой версии.
Как определить, что нужно оптимизировать вычисление события
Если в карточках объектов содержатся сотни или тысячи записей и выполнение в них действий занимает время, то проверьте, как вызывается обработчик события Возможность выполнения (CanExecute). Скорее всего обработчик вызывается многократно для каждой записи, и это нагружает систему. В такой ситуации рекомендуется оптимизировать вычисление события:
1.С помощью информации из лог-файла веб-сервера определите, для каких действий обработчик события вызывается многократно и замедляет работу. Для этого в лог-файле запустите поиск по фразе "method":"child". Для логгера с названием CanExecutesSpan в атрибуте span фиксируется информация о выполнении события (CanExecute) в дочерних коллекциях.
Пример лог-файла:
{
"t":"2023-09-22 11:03:01.541+04:00",
"pid":"22436+130",
"tr":"cl-7d941297-9b305f",
"l":"Info",
"lg":"CanExecutesSpan",
"span":{
"durationMs":707,
"status":"Ok",
"entitiesCount":151,
"method":"child",
"statCount":13,
"totalTimeMs":1043,
"isLong":true,
"topTime":"[{\"NameGuid\": \"7a0d8bb0-0de6-4f37-8417-a61ede7c111d\", \"Name\": \"OpenCard\", CanExecute: \"Sungero.Domain.Client.ChildEntityActions.CanOpenCard\" DurationMs: 231},{\"NameGuid\": \"2cd06508-0938-4197-85ca-ce1cb0ce9750\", \"Name\": \"CreateDoc\", CanExecute: \"Sungero.Domain.Client.ChildEntityActions.CanCreateDoc\" DurationMs: 197},{\"NameGuid\": \"fe14d141-d127-4ebc-81bd-d6f9b1ce2265\", \"Name\": \"ExportDoc\", CanExecute: \"Sungero.Domain.Client.ChildEntityActions.CanExportDoc\" DurationMs: 279}]"},
"un":"Domain\\ardo_na",
"tn":"Directum RX",
"v":"4.8.0.0000"
}
2.В атрибуте durationMs проверьте общую длительность выполнения всех обработчиков события. Если длительность превышает 500 миллисекунд, то добавляется атрибут isLong со значением true. Это значит, что необходимо оптимизировать вычисление обработчика.
3.Если в лог-файле есть строки с атрибутом "isLong":true, то в атрибуте topTime посмотрите имена действий, для которых нужно оптимизировать вычисление. В среде разработки для этих действий установите флажок Проверять возможность выполнения один раз для коллекции. Также учтите, что:
•проверка доступна, если в редакторе типа сущности для действия сняты флажки Действие-переключатель или Доступно при отсутствии выделенных записей в списке. Если флажки установлены, то при сохранении изменений появится сообщение и изменения нельзя будет сохранить:
•в коде обработчика события Возможность выполнения не рекомендуется обращаться к дочерней сущности через _obj или e.Entity. Если конструкции используются, то при сборке решения в окне вывода появляется предупреждение, обработчик события выполняется один раз для всей коллекции, а не для отдельной дочерней коллекции:
Важно. Нельзя в наследниках или перекрытиях переопределить флажок Проверять возможность выполнения один раз для коллекции:
•для действий Копирование строки (CopyChildEntity), Удаление строки (DeleteChildEntity) и Добавление строки (AddChildEntity);
•для действий, добавленных в родительском типе сущности.
© Компания Directum, 2024 |