通过使用异步 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中返回它。

通过使用异步 Web 方法调用提高性能

嗯,第一个问题是你在 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] 并且仍然没有提供值?

就我理解的问题而言,我想你会在这里找到你需要的东西。