2017-02-02 7 views
1

Как только я нажимаю «Enter» после того, как я написал асинхронную функцию в ячейке, функция async корректно вызывается, а Excel вызывает событие xleventCalculationEnded, когда расчет завершен.Асинхронные UDF и xleventCalculationCanceled

Однако, если я нажимаю другую ячейку сразу после того, как нажал «Enter», событие xleventCalculationCanceled будет поднято, а затем функция async вызывается в другое время! Это нормальное поведение? Должен ли я вернуть результат через Excel12(xlAsyncReturn,...) для первого асинхронного вызова, для второго асинхронного вызова или для обоих?

Иными словами, означает ли событие xleventCalculationCanceled, что Я не вынужден вернуть результат в Excel? (с использованием соответствующего asyncHandle)

Я использую async-функции для делегирования интенсивных вычислений в другом потоке и не блокировать excel во время вычислений. Однако, если асинхронная функция вызывается автоматически два раза (так как это происходит, когда пользователь щелкает другую ячейку, не дожидаясь завершения первого вызова), то интенсивное вычисление вычисляется два раза для одного и того же входа (поскольку первый вызов - по-прежнему жить в потоке делегатов ...) Как вы справляетесь с этой проблемой?

Два вызова для одной и той же функции - с одним и тем же вводом - это ошибка?

Большое спасибо

ответ

1

Что вы описываете, это нормальное поведение. Excel отменяет, а затем перезапускает асинхронные вычисления при взаимодействии с пользователем (и может делать это несколько раз).

The documentation предполагают, что:

  1. xleventCalculationEnded будет срабатывать непосредственно после xleventCalculationCanceled и

  2. Вы можете освободить ресурсы, выделенные в процессе расчета, когда xleventCalculationEnded пожаров. Я понимаю, что включить любой asyncHandle, который у вас может быть, и, следовательно, вам не нужно возвращать какой-либо результат на основе дескриптора.

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

 Смежные вопросы

  • Нет связанных вопросов^_^