2013-04-09 6 views
2

좀 계산 큐에 ExcelFunction 있습니다XlCall.Excel (XlCall.xlcCalculateNow)는 BackgroundWorker에에서 evented XlCallException을 던졌습니다

[ExcelFunction(...)] 
public static void QueueCalcs(... takes ranges ...) 
{ 
    var calcRequests = ... builds list of calc request parameters from ranges ... 
    calcRequests.ForEach(QueueCalculation); 
} 

public static void QueueCalculation(calcRequestParameters) 
{ 
    var bWorker = new BackgroundWorker(); 
    bWorker.DoWork += bWorkerDoWork; 
    bWorker.RunWorkerCompleted += bWorkerRunWorkerCompleted; 
    bWorker.RunWorkerAsnc(calcRequestParameters); 
} 

private static void bWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    XlCall.Excel(XlCall.xlcCalculateNow); 
} 

작업자가 성공적으로 완료되지만 onComplete를 위임 예외 :

Exception of type 'ExcelDna.Integration.XlCallException' was thrown 

배경 작업자를 제거하고 XlCall.Excel (XlCall.xlcCalculateNow)을 호출 한 다음 정기적 인 foreach 루프를 사용하면 함수가 예상대로 작동합니다.

이와 같은 작업을 수행 할 수 있습니까?

답변

2

계산할 수없는 스레드에서 Excel C API (XlCall.Excel 또는 ExcelReference 메서드)를 호출 할 수 없습니다.

Excel-DNA에는 기본 Excel 스레드의 매크로 컨텍스트에서 실행되도록 작업 대기열을 만들 수있는 도우미가 있습니다 (ExcelAsyncUtil.QueueAsMacro(...)).

정확히 무엇을 하려는지 명확하지 않지만 비동기 함수를 구현하려는 경우 올바른 접근 방식처럼 보이지 않습니다. one-time async functions에 대한 내장 지원이 있거나 real-time data feeds based on the Reactive Extensions.

+0

ExcelAsyncUtil.QueueAsMacro (...)가 작동했습니다. 지난 몇 시간 동안 RDT 서버 나 RxExtensions 중 하나를 사용하려고했지만, 예제가 부족해도 아무 것도 작동하지 않게되었습니다. 기본적으로 계산을 위해 일부 웹 서비스를 쿼리하고 추가 기능에서 응답을 캐시하며 Excel 기능을 통해 캐시 된 응답의 속성에 액세스 할 수 있습니다. 나와 함께 인도 할 수있는 실천 사례가 있습니까? – yenta

+0

다음 예를 시도해보십시오. http://excel-dna.net/2013/04/02/caching-and-asynchronous-excel-udfs/ 그런 다음 http://groups.google. Google 그룹에 게시하십시오. co.kr/group/excedna에 문의하십시오. – Govert

+0

나는 그 게시물을 놓친 것에 대해 약간 바보 같다. 고마워, 내가 살펴볼 게. – yenta