У меня есть простое представление:
public PXSelect<MPEmployeeTermination, Where<MPEmployeeTermination.employeeID,
Equal<Current<TerminationFilter.employeeID>>,
And<MPEmployeeTermination.payRunID, Equal<Current<TerminationFilter.payRunID>>>>> EmployeeTerminations;
и метод, который его инициализирует:
public IEnumerable employeeTerminations()
{
return _terminationHandler.GetEmployeeTerminations(EmployeeTerminations, EmployeeTerminationItems, OtherTerminationPayments);
}
Метод GetEmployeeTerminations
(возвращает IEnumerable
) тяжелый и работает до часто - любая операция в этом интерфейсе. Я не могу найти никакого контроля, когда вызывается этот метод, тогда как метод GetEmployeeTerminations
может быть вызван только один раз при инициализации (когда вызывается конструктор). Я могу использовать поле Boolean stati c, чтобы запустить метод один раз, но я считаю, что существуют другие рекомендованные шаблонами Acumatica, такие как атрибуты, et c. Можно установить EmployeeTerminations = GetEmployeeTerminations
, но неясно, как конвертировать IEnumerable
в PXSelect<MPEmployeeTermination>
. Как я могу сделать это в соответствующем паттерне Acumatica или же существует лучшая модель, чем просто поле * stati c?
UI:
Буду благодарен любому совету или предложению.
Я обновляю свой вопрос :
Конструктор вызывает каждый время, когда изменяется любое редактируемое свойство в пользовательском интерфейсе. Решение с stati c boolean не работает, потому что, когда я открываю и закрываю пользовательский интерфейс, поле stati c уже сохраняется. Если поле не является stati c - оно будет сбрасываться каждый раз при запуске конструктора, следовательно, это также не будет работать.
Этот метод
_terminationHandler.GetEmployeeTerminations(EmployeeTerminations, EmployeeTerminationItems, OtherTerminationPayments)
вычисляет значения для "master" "DA C MPEmployeeTermination
, а также для" деталей "DA C MPEmployeeTerminationItem
. DA C MPEmployeeTerminationItem
отвечает за 2 сетки данных в мастере и вычисляет данные в обоих ЦАП, связывается с удаленным сервером и т. Д. c. Иногда это работает быстрее, иногда медленнее, но субъективное время пользователя кажется слишком медленным:
И всегда в конце последовательности мы имеем таинственный tread.sleep, который занимает больше времени, чем наша операция, и происходит за кулисами Acumatica: Я считаю, что рекомендация слишком запускать этот метод только один раз при загрузке. Какое лучшее место для этого? Даже конструктор работает здесь, когда каждое свойство в DA C изменяется.
Другой тяжелый метод вызывается в событии MPEmployeeTermination_TerminationDate_FieldUpdated
и не может быть перемещен в другое место и должен выполнять все вычисления, когда эта дата изменилась.
Основная идея слишком улучшить пользовательский опыт и предотвратить момент, когда пользовательский интерфейс застрял. Может быть, я могу использовать асинхронное программирование?
Например, если я изменю метод на
public async Task<IEnumerable> employeeTerminations()
{
return await Task.Run(() => _terminationHandler.GetEmployeeTerminations(EmployeeTerminations, EmployeeTerminationItems, OtherTerminationPayments));
}
Пользовательский интерфейс больше не застревает, но я не уверен во всех возможных побочных эффектах на платформе Acumatica , И это событие такое MPEmployeeTermination_TerminationDate_FieldUpdated из-за ограничения Acumatica.