通过使用异步 Web 方法调用提高性能
本文关键字:方法 调用 高性能 Web 异步 | 更新日期: 2023-09-27 18:06:47
正在做的项目的主要重点是创建一个Excel自动化函数(CEF
(,它允许用户根据函数中提供的参数获取相关数据。CEF 将在用户使用以下公式的位置填充单元格,">=CEF(id, [param1],[param2], ...">
public string CEF(string id, string param1 = "", string param2 = "", string param3 = "", string param4 = "")
{
return results;
}
它后面是一个Web方法(getDataString()
(,它被CEF
公开并调用,以便它可以通过Web服务从数据库中检索结果。
在最初的实现中,我使用同步方法来调用 web 方法,结果证明这是相当有问题的。Excel 冻结,直到返回所有结果。
所以我决定在这里尝试使用异步方法(我遵循的示例(,但它实际上给了我一个新问题——CEF
总是返回 null。
void getDataStringCompleted(object sender, getDataStringCompletedEventArgs args)
{
results = args.Result;
}
我想我总是得到空值的原因可能是因为CEF
总是先被击中,从而返回一个空字符串。目前我有点卡住了,不知道从这里去哪里。谁能帮忙或给我一些指示?非常感谢。
编辑:
当我调试代码时,我发现挂机事件的代码可能无法正常工作。
public string CEF(string id, string param1 = "", string param2 = "", string param3 = "", string param4 = "")
{
MyWebservice service = new MyWebservice();
//Hookup async event handler
service.getDataStringCompleted += new
getDataStringCompletedEventArgs(this.getDataStringCompleted); // <=problem
service.getDataStringAsync(id,param1, param2, param3, param4); // <=problem
return results;
}
我想知道是否有任何方法可以先调用getDataStringCompleted
,并将值分配给变量results
,然后在方法CEF
中返回它。
嗯,第一个问题是你在 CEF
内部返回results
,而
public string CEF(string id, string param1 = "", string param2 = "", string param3 = "", string param4 = "")
{
MyWebservice service = new MyWebservice();
//Hookup async event handler
service.getDataStringCompleted += new
getDataStringCompletedEventArgs(this.getDataStringCompleted);
service.getDataStringAsync(id,param1, param2, param3, param4);
return results; // <- Isn't set yet!
}
在异步调用中,无法从调用方法的位置返回结果。每当触发时,事件处理程序都会有结果。在您的情况下,您将在事件处理程序设置它之前返回results
。 在这种情况下,CEF
将无法返回值。事件处理程序必须获取该值并将其放入相应的单元格中。
有时在使用 OFfice 时,让异步内容正常工作要困难得多。可悲的是,这是其中之一。如果 Excel 需要CEF
返回值,我不确定您将如何解决这个问题,因为您必须以一种或另一种方式阻止,直到您从服务中取回一个值(最简单的方法是同步调用它(。
就个人而言,当需要将数据直接流式传输到电子表格时,我是RTD功能的粉丝。在这种情况下,这可能是矫枉过正。[关于RTD的好文章:http://support.microsoft.com/kb/285339]
当您说您的函数返回"null"时 - 您是否在几秒钟或几分钟后刷新电子表格 [F9] 并且仍然没有提供值?
就我理解的问题而言,我想你会在这里找到你需要的东西。