|
![]() |
#1 |
Участник
|
Глянул в код.
Sandbox это новый механизм, который позволяет выполнять длительные операции в отдельной сессии но при этом асинхронно, показывая стандартную форму ожидания асинхронной операции (то есть с точки зрения фреймфорка UI тред продолжает принимать сообщения, с точки зрения пользователя см SysOperationSandboxForm). Он используется: - В RunBaseBatch (надо перекрыть метод canRunInNewSession и вызывать runOperation вместо run) - В SysOperation (см выше при синхронном вызове) - Напрямую (это то, что приведено в блоге) То есть если нужны навороты, пользуйтесь старыми фреймворками. Если есть просто статический метод который может долго выполняться, то дергайте напрямую, чтоб не блокировать обработку событий UI. Я не вижу тут ничего извращенного. Жалко только прогрессбар для операций не реализовали |
|
![]() |
#2 |
Участник
|
canRunInNewSession можно использовать только для обработок, которые не используют файлы. с этой штукой class File не работает.
|
|
![]() |
#3 |
Участник
|
|
|
![]() |
#4 |
Участник
|
Цитата:
Как мне кажется она не потеряла своей актуальности. У меня как раз возникла проблема, после длительной операции, более 10 мин, нужно вернуть пользователю файл с данными. Чтобы сессия не отвалилась в обычный RunBaseBatch класс был добавлен метод canRunInNewSession = true. и действительно в методе Run класс File отказывается работать. Нигде не нашел подсказок как обойти это, только благодаря этой ветке это стало возможным. Делюсь опытом возможно кому то пригодиться: в Run методе после того как закончилось заполнение объекта файла, *StreemIO в моем примере или любого другого файла, содержимое файла необходимо перегнать в строковую переменную которая участвует в Pack/Unpack. Затем, после выполнения RunOperation вызвать код отправки файла пользователю. X++: class Test_RunbaseBatch extends RunBaseBatch { // Packed variables str csvFileContent; #define.CurrentVersion(1) #localmacro.CurrentList csvFileContent #endmacro public container pack() { return [#CurrentVersion,#CurrentList]; } public void run() { if (! this.validate()) throw error(""); commaStreamIo iO = commaStreamIo::constructForWrite(); container header = ["Num"]; iO.writeExp(header); int i; for (i=1; i<=660; i++) { iO.write(i); // sleep(1000); //Over 10 min. sleep(100); } System.IO.Stream stream = iO.getStream(); stream.Position = 0; System.IO.StreamReader reader = new System.IO.StreamReader(stream); csvFileContent = reader.ReadToEnd(); } public void runAfterOperation() { Filename filename = "file.csv"; File::SendStringAsFileToUser(csvFileContent, filename, System.Text.Encoding::Unicode); info(strFmt("CSV file %1 Sent to user",filename)); } public boolean runsImpersonated() { return true; } public boolean unpack(container packedClass) { Version version = RunBase::getVersion(packedClass); ; switch (version) { case #CurrentVersion: [version,#CurrentList] = packedClass; break; default: return false; } return true; } public boolean validate(Object _calledFrom = null) { if (false) return checkFailed(""); return true; } static ClassDescription description() { return "Test RunBase"; } static Test_RunbaseBatch construct() { return new Test_RunbaseBatch(); } static void main(Args args) { Test_RunbaseBatch runBase; runBase = Test_RunbaseBatch::construct(); if (runBase.prompt()) { runBase.runOperation(); runBase.runAfterOperation(); } } protected boolean canRunInNewSession() { return true; } } Последний раз редактировалось kair84; 20.01.2021 в 15:04. |
|
|
За это сообщение автора поблагодарили: Vadik (1), trud (2). |
Теги |
#страшнодалекиониотнарода |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|