用户定义的异步函数

适用于:Excel 2013 | Office 2013 | Visual Studio

Microsoft Excel 2013可以异步调用用户定义的函数。 异步调用函数可以通过允许同时运行多个计算来提高性能。 在计算机群集中运行用户定义函数时,异步调用函数允许使用多台计算机完成计算。

何时使用异步用户定义函数

某些用户定义的函数必须等待外部资源。 等待时,Excel 计算线程被阻止。 在 Excel 2013 中,用户定义的函数可以异步运行。 这会将计算线程释放为在用户定义函数等待时运行其他计算。

在 Excel 2007 中,程序员可以通过增加多线程重新计算中使用的线程数来同时运行多个用户定义的函数。 此方法有缺点,主要是因为线程数是限定于应用程序的设置,不能在单个函数或外接程序的级别进行控制。

当函数必须等待外部资源时,程序员应使用异步用户定义函数调用。 例如,通过 Internet 发送 SOAP 请求的函数必须等待网络传递请求,远程服务器完成请求,网络必须返回结果。 在这种情况下,不会发生重大计算,Excel 可以继续执行其他计算。

当函数向计算群集发送请求时,程序员还可以使用异步用户定义函数。 在这种情况下,不仅需要等待网络延迟,群集还可以在单独的服务器上执行单独的调用。 通过不等待每个调用完成,调用可能会重叠以提高性能。 在某些情况下,这种改进是显著的。

注意

用户定义函数不能同时注册为异步函数和群集安全函数。

编写异步用户定义函数

异步用户定义函数必须跟踪句柄,并在通知 Excel 函数调用已完成时使用该句柄。 异步用户定义函数分为两部分。 第一个部分是标准 UDF 入口点,它将启动第二个单独的异步操作。 应在 UDF 入口点期间对 Excel 进行回调。 然后,函数的第一个启动部分会将其计算线程的控制权返回到 Excel,后者将继续计算。 第二个异步操作完成后,它必须回调到 Excel 中,并为 Excel 提供其结果。

注意

必须深入复制函数的异步部分传入 UDF 的任何参数,因为 Excel 会在 UDF 入口点返回时释放这些参数。

Excel 提供了一组事件,XLL 外接程序可以使用这些事件来管理异步 UDF 调用的生命周期。 这些事件指示 Excel 已完成计算或计算已取消。

声明异步函数

注册异步用户定义函数时,必须将异步用户定义函数声明为异步函数。 这是通过添加指向 XLOPER12 结构的参数(由注册类型字符串中的“X”表示)(在 UDF 参数列表中的任何位置)来执行的。 Excel 使用此参数传递异步调用句柄。 当结果准备就绪时,XLL 加载项必须将异步调用句柄和函数的结果传递回 Excel。 此外,UDF 的返回类型应为 void,由“”>指定为类型字符串中的第一个字符。 返回类型为 void,因为 UDF 的同步部分不向 Excel 返回值。 相反,XLL 加载项通过回调异步返回值。

可以将异步函数声明为线程安全,然后在多线程重新计算中使用 UDF 的同步部分。

下面的代码示例演示使用“QX”>作为注册类型字符串注册的异步用户定义函数:

void MyAsyncUDF(LPXLOPER12 arg1, LPXLOPER12 pxAsyncHandle)
{
…
}

返回值

异步调用的结果准备就绪后,XLL 加载项通过执行 xlAsyncReturn 类型的回调将结果返回到 Excel。

xlAsyncReturn 是在重新计算期间可在非计算线程上使用的唯一回调。 因此,异步 UDF 的异步部分不应执行任何其他回调。

正在处理事件

从 Excel 2010 开始,XLL 可以接收旨在管理异步函数生命周期的事件。 有关详细信息,请参阅 处理事件

另请参阅