在 asp.net 中调用需要轮询的 Web 服务的最佳编码模式是啥?

Posted

技术标签:

【中文标题】在 asp.net 中调用需要轮询的 Web 服务的最佳编码模式是啥?【英文标题】:What is the best coding pattern in asp.net for calling a web service which requires polling?在 asp.net 中调用需要轮询的 Web 服务的最佳编码模式是什么? 【发布时间】:2014-04-21 14:31:15 【问题描述】:

在 ASP.NET 中,我必须调用具有以下语义的报告服务: 1. 创建报告 2. 检查报告是否可以下载 3. 下载报告

我当前的实现是#2 在循环中使用 Thread.Sleep(1000) 完成,以便我每秒轮询一次。

我想知道是否有更好的方法来使用 ASP.NET 4.5 异步方法来完成此任务。

【问题讨论】:

生成报告是否需要很长时间(长到足以导致客户端请求超时)?如果没有,我会认为使用异步方法,只需等待报告就可以了,因为请求不会阻塞。 我不能只是“等待”——我必须投票。 【参考方案1】:

我会读到:

WCF Duplex

SignalR

并检查最适合您的(根据您的客户和有关您的应用程序的其他考虑)。

【讨论】:

【参考方案2】:

如果您想使用异步进行轮询,请使用 Task.Delay 而不是 Thread.Sleep:

while (await proxy.PollServer())

    await Task.Delay(1000);


return await proxy.DownloadReport();

如前所述,您可以翻转您的架构,以便服务器在完成后使用SignalR 通知客户端:

【讨论】:

我无法控制服务器或客户端。我的是一个网络服务代理层。 Tread.Sleep 和 Task.Delay 的区别在于调用线程所做的事情。使用 Thread.Sleep 线程被阻塞。但是,如果像我的情况一样,在 while 循环中没有其他工作要做,那么 Tread.Sleep 和 Task.Delay 之间有什么区别吗? @ChrisHarrington 它是作为整个 async-await 的一部分添加到 .Net 4.5 中的。它在内部创建一个 Timer,因此它不会用完线程。 @ChrisHarrington 行为相似,因为两者都有相同的动机,即在有限的时间跨度内停止执行。但是 Task.Delay 释放线程以在系统的其他部分上工作,而 Thread.Sleep 浪费资源并损害可伸缩性。

以上是关于在 asp.net 中调用需要轮询的 Web 服务的最佳编码模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

需要从外部服务器进行实时轮询的网站架构设计

PHP & MySQL:检查表的数据是不是在没有轮询的情况下发生了变化?

是否有不需要在服务器端修改的情况下轮询的 ajax 替代方案?

使用Azure Functions 在web 应用中启用自动更新分析基于轮询的 Web 应用的限制

web前端轮询获取数据的定义及优劣

无需持续轮询的实时 Twitter 流