Асинхронные пользовательские функции

Область применения: Excel 2013 | Office 2013 | Visual Studio

Microsoft Excel 2013 может асинхронно вызывать определяемые пользователем функции. Асинхронный вызов функций может повысить производительность, позволяя выполнять несколько вычислений одновременно. При выполнении пользовательских функций в вычислительном кластере асинхронный вызов функций позволяет использовать в вычислениях несколько компьютеров.

Когда следует использовать асинхронные определяемые пользователем функции

Некоторые пользовательские функции должны ожидать внешних ресурсов. Пока они ожидают, поток вычислений Excel блокируется. В Excel 2013 определяемые пользователем функции могут выполняться асинхронно. Это освобождает поток вычислений для выполнения других вычислений во время ожидания определяемой пользователем функции.

В Excel 2007 программисты могут одновременно выполнять несколько определяемых пользователем функций, увеличив количество потоков, используемых при пересчете нескольких потоков. Этот метод имеет недостатки главным образом потому, что количество потоков является параметром, заданным для приложения и не может управляться на уровне одной функции или надстройки.

Программисты должны использовать асинхронные вызовы определяемых пользователем функций, когда функция должна ожидать внешних ресурсов. Например, функция, которая отправляет запрос SOAP через Интернет, должна ждать, пока сеть доставит запрос, удаленный сервер завершит запрос, а сеть возвращает результат. В этом случае значительных вычислений не происходит, и Excel может продолжить выполнение других вычислений.

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

Примечание.

Определяемые пользователем функции не могут быть зарегистрированы как асинхронные и кластерные.

Написание асинхронной определяемой пользователем функции

Асинхронные пользовательские функции должны отслеживать дескриптор и использовать этот дескриптор при информировании Excel о завершении вызова функции. Асинхронная определяемая пользователем функция разделена на две части. Первая часть — это стандартная точка входа UDF, которая запускает вторую отдельную асинхронную операцию. Обратные вызовы в Excel должны выполняться во время точки входа UDF. Первая запускающая часть функции затем вернет управление потоком вычислений в Excel, который продолжит вычисление. После завершения второй асинхронной операции он должен вернуться в Excel и предоставить Excel свой результат.

Примечание.

Все аргументы, передаваемые в определяемую пользователем функцию, необходимые асинхронной части функции, должны быть глубоко скопированы, так как Excel освобождает эти аргументы при возврате точки входа определяемой пользователем функции.

Excel предоставляет набор событий, которые надстройка XLL может использовать для управления жизненным циклом асинхронных вызовов UDF. Эти события указывают на то, что в Excel завершены вычисления или что вычисление было отменено.

Объявление асинхронной функции

Необходимо объявить асинхронные пользовательские функции как асинхронные при их регистрации. Это выполняется путем добавления параметра, указывающего на структуру XLOPER12, представленную символом "X" в строке типа регистрации, в любом месте списка параметров UDF. Excel использует этот параметр для передачи асинхронного дескриптора вызова. Надстройка XLL должна передать асинхронный дескриптор вызова и результат функции обратно в Excel, когда результат будет готов. Кроме того, возвращаемый тип определяемой пользователем функции должен быть пустым, обозначая его как ">" в качестве первого символа в строке типа. Тип возвращаемого значения является недействительным, так как синхронная часть определяемой пользователем функции не возвращает значение в Excel. Вместо этого надстройка XLL возвращает значение асинхронно через обратный вызов.

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

В следующем примере кода показана асинхронная определяемая пользователем функция, зарегистрированная с помощью QX> в качестве строки типа регистрации:

void MyAsyncUDF(LPXLOPER12 arg1, LPXLOPER12 pxAsyncHandle)
{
…
}

Возврат значений

Когда результат асинхронного вызова готов, надстройка XLL возвращает результат в Excel путем выполнения обратного вызова типа xlAsyncReturn.

xlAsyncReturn — это единственный обратный вызов, который можно использовать в потоках, не относящихся к вычислению, во время пересчета. Таким образом, асинхронная часть асинхронной определяемой пользователем функции не должна выполнять другие обратные вызовы.

Обработка событий

Начиная с Excel 2010, библиотеки XLL могут получать события, предназначенные для управления жизненным циклом асинхронной функции. Дополнительные сведения см. в разделе Обработка событий.

См. также