在 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 替代方案?