2

我有一个 ExcelFunction 排队一些计算:

[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),则该函数的行为与预期相同。

做这样的事情可能吗?

4

1 回答 1

2

您不能从非计算线程调用 Excel C API(XlCall.Excel 或任何 ExcelReference 方法)。

Excel-DNA 有一个帮助程序,可让您排队工作以在 Excel 主线程调用的宏上下文中运行ExcelAsyncUtil.QueueAsMacro(...)

目前尚不清楚您要做什么,但是如果您要实现异步函数,这似乎不是正确的方法....有一些对一次性异步函数的内置支持或基于 Reactive Extensions 的实时数据馈送

于 2013-04-09T15:24:38.390 回答