打包多个请求以减少与服务器的连接数

时间:2016-08-26 10:19:08

标签: c# excel async-await udf excel-dna

我正在使用ExcelDNA编写Excel插件并创建UDF(用户定义函数)。

UDF建立与服务器的连接,该服务器连接到SQL数据库以检索数据并将其发送回客户端。

但是,预计这个UDF将在一个工作表中被调用数百次。

我正试图找到一种方法来减少对服务器的请求数量。

截至目前,这就是模板的样子(简化):

    ITEM     | JAN 2016 | FEB 2016 | MAR 2016 |
---------------------------------------------------
   ITEM 1    |    UDF   |    UDF   |   UDF    |
   ITEM 2    |    UDF   |    UDF   |   UDF    |
   ITEM 3    |    UDF   |    UDF   |   UDF    |
   ITEM 4    |    UDF   |    UDF   |   UDF    |
   ITEM 5    |    UDF   |    UDF   |   UDF    |
   ITEM 6    |    UDF   |    UDF   |   UDF    |

所以,现在,这将总共发出18个请求。

我想尝试将请求数量减少到6个。

我现在想的方法是,对于每个项目,无论先发送哪个请求,都会获得该项目列出的所有月份的数据。然后对同一项目的第二次请求将等待第一次请求的结果。

例如:

对于第1项, 如果首先调用JAN 2016列中的UDF,它将为ITEM 1的所有月份请求数据,然后将该数据存储在某处以供其他请求使用。

然后当第二个请求到来时(让我们说2016年3月是下一个),UDF将等待2016年1月的UDF结果。这样,2016年3月的UDF将不必再启动另一个连接到服务器。

但是,我不知道如何实现这一点。我听说过关键字await和async,但没有使用它们的经验。

也欢迎任何其他问题的解决方案。

2 个答案:

答案 0 :(得分:0)

异步调用不会帮助您减少呼叫次数,它只会启动更多并行呼叫。通话次数是否会导致您出现问题?也许是最佳实践"在这里帮助你:C# Data Connections Best Practice?

答案 1 :(得分:0)

异步功能和批处理可以帮助您。基本上,您会在短时间内(例如半秒)收集您想要对后端发出的所有请求,然后向后端发出一个呼叫。当结果返回时,您将为每个请求完成异步调用。

此Gist完全实现了异步和批处理部分,您只需提供批处理评估功能:https://gist.github.com/govert/1bf0a1026ec3aaee19a8

对于此示例的任何后续问题,Excel-DNA Google小组可能更好。