2013-04-09 31 views
2

我有排隊一些計算的ExcelFunction:XlCall.Excel(XlCall.xlcCalculateNow)拋出一個XlCallException從一個BackgroundWorker事件觸發時

[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 

如果我刪除後臺工作器並使用常規的foreach循環,然後調用XlCall.Excel(XlCall.xlcCalculateNow),則該函數的行爲與預期的相同。

正在做這樣的事情嗎?

回答

2

您不能從非計算線程調用Excel C API(XlCall.Excel或任何ExcelReference方法)。

Excel-DNA有一個幫助器,讓您排隊工作,在主Excel線程的宏上下文中運行 - 請致電ExcelAsyncUtil.QueueAsMacro(...)

這並不完全清楚你想要做什麼,但如果你試圖實現異步功能,這似乎不是正確的方法....有一些內置的支持one-time async functionsreal-time data feeds based on the Reactive Extensions

+0

ExcelAsyncUtil.QueueAsMacro(...)工作。我花了幾個小時試圖使用RDT服務器或RxExtensions,但缺乏示例阻礙了使任何工作成功。基本上,我想查詢一些Web服務進行計算,將響應緩存在加載項中,並通過Excel函數提供對緩存響應的屬性的訪問。那裏有一個可以指導我的工作示例嗎? – yenta 2013-04-09 15:44:08

+0

也許你可以試試這個例子:http://excel-dna.net/2013/04/02/caching-and-asynchronous-excel-udfs/,然後通過http://groups.google.com發佈到Google小組。 com/group/excedna跟進問題。 – Govert 2013-04-09 17:01:45

+0

我錯過了那篇文章,感覺有點愚蠢。謝謝,我會看看。 – yenta 2013-04-09 19:28:53