Delphi.FireDAC. Асинхронное выполнение

Данная статья посвящена асинхронному выполнению в FireDAC. Она основана на официальной документации

-старая версия

-новая версия

Программист может выбирать между 4 режимами, используя свойство ResourceOptions.CmdExecMode

Далее, в документации приводится такая таблица

17

Приложение проверяет статус TFDCommand.State илиTFDAdaptedDataSet.Command.State

19

 

Например, можно сделать таким образом

Если операция долгая, можно использовать специальный диалог TFDGUIxAsyncExecuteDialog. Для этого достаточно добавить его на форму и выбрать ResourceOptions.CmdExecMode:=amCancelDialog

Асинхронное открытие и получение (Asynchronous Open and Fetching)

Когда приложение должно открыть запрос асинхронно, и запрос связан с GUI, используя TDataSource, то TDataSource должен быть отсоединен от запроса до открытия и соединен обратно после открытия query, например

Этого не требуется когда используется amCancelDialog. Также, получение с GUI не может быть подготовлено в amAsync режиме. Чтобы открыть запрос и получить большое множество асинхронно, установите FetchOptions.Mode в режим fmAll. Тогда обе операции будут происходить в бэкграунд режиме. Этот процесс возможно только при двунаправленных курсорах.

Выход из длинных операций

Программист может вручную ограничивать время выполнения операций.

Альтернативно можно использовать метод AbortJob из другого потока либо этот же метод для FDConnection

Множественные асинхронные запросы. (Multiple Asynchronous Queries)

Не поддерживаются FireDAC. Но можно поступить следующим образом

-Группировать несколько запросов в хранимую процедуру и вызывать процедуру асинхронно

-Использовать отдельное соединение для каждого асинхронного запроса, запускаемого параллельно

-Запускать следующий асинхронный запрос только после того как предыдущий будет закончен. Для этого можно использовать AfterOpen и AfterExecute

-В конце концов, приложение может использовать потоки и исполнять запросы в отдельных потоках

 

This entry was posted in Delphi, FireDAC. Bookmark the permalink.