我有一个 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),则该函数将按预期运行。
做这样的事情可能吗?
您不能从非计算线程调用 Excel C API(XlCall.Excel 或任何 ExcelReference 方法)。
Excel-DNA 有一个帮助程序,可让您将工作排队以在主 Excel 线程的宏上下文中运行 - 调用ExcelAsyncUtil.QueueAsMacro(...)
.
目前尚不清楚您要做什么,但如果您尝试实现异步函数,这似乎不是正确的方法......有一些内置支持一次性异步函数 https://exceldna.codeplex.com/wikipage?title=Asynchronous%20Functions or 基于反应式扩展的实时数据馈送 https://exceldna.codeplex.com/wikipage?title=Reactive%20Extensions%20for%20Excel.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)