2017-02-02 2 views
1

비동기 함수를 셀에 쓴 후 "Enter"를 누르면 비동기 함수가 올바르게 호출되고 계산이 끝나면 Excel에서 이벤트 xleventCalculationEnded을 발생시킵니다.비동기 UDF 및 xleventCalculationCanceled

그러나 "입력"을 클릭 한 직후에 다른 셀을 누르면 xleventCalculationCanceled 이벤트가 발생하고 비동기 함수가 다른 시간에 호출됩니다! 이 행동이 정상입니까? 두 번째 비동기 호출 또는 두 가지 비동기 호출 모두에 대해 Excel12(xlAsyncReturn,...)을 통해 결과를 반환해야합니까?

다른 말로하면 xleventCalculationCanceled 이벤트는 그 결과를 의미합니까 나는을 Excel로 결과를 강제로 반환하지 않습니까? (적절한 asyncHandle 사용)

다른 스레드에서 집중적 인 계산을 위임하고 계산 중에 Excel을 차단하지 않는 비동기 함수를 사용하고 있습니다. 그러나 비동기 함수가 자동으로 두 번 호출되면 (사용자가 첫 번째 호출을 기다리지 않고 다른 셀을 클릭하는 경우와 같이) 동일한 입력에 대해 집중적 인 계산이 두 번 계산됩니다 (첫 번째 호출이 취소되었으므로 엑셀 여전히 - 대리인 스레드에 살고 ...) 어떻게이 문제를 해결합니까?

두 함수가 동일한 호출을 요구합니다 - 버그입니까?

많은 감사합니다.

답변

1

설명하는 것은 정상적인 동작입니다. Excel은 사용자 상호 작용이있을 때 비동기 계산을 취소 한 다음 다시 시작합니다 (여러 번 수행 할 수도 있음).

  1. xleventCalculationEndedxleventCalculationCanceled 후 직접 발사되며,

  2. 당신은 계산 xleventCalculationEnded 화재시 할당 된 자원을 해제 할 수 있습니다

    documentation

    는 것이 좋습니다. 귀하가 가지고있을 수도있는 asyncHandle을 포함 시키므로 핸들을 기반으로 한 결과를 반환하지 않아도된다는 것을 알고 있습니다.

장기간 작동하는 기능으로 비행 중에 취소 할 수있는 경우 작업을 취소 할 수 있습니다. 그렇지 않으면 어떤 함수 호출이 비행 중인지에 대한 내부적 인 부기를 수행 할 수 있으며, 그런 식으로 두 번 일을하지 못하게 할 수 있습니다.