Web应用程序中的异步函数Thread.Sleep

时间:2010-09-08 22:51:23

标签: c# .net asp.net asynchronous

我维护一个ASP.NET Web应用程序,该应用程序在执行过程时会导致用户的网络连接重置几秒钟。因此,页面请求在用户端超时,因为它们从未收到Web应用程序的响应(连接在获取响应数据包之前就已消失)。

为了解决这种情况,我正在考虑让ASP.NET页面执行一个包含Thread.Sleep(5000); // sleep for 5 seconds before executing the connection reset的异步函数。这样,​​浏览器在连接重置之前有5秒钟的时间来接收页面的响应。

我担心在ASP.NET中使用Thread.Sleep和异步函数。我以前从未尝试过,所以我不确定它可能造成的潜在问题。有没有人看到在ASP.NET应用程序中启动包含Thread.Sleep的异步线程的潜在问题?如果是这样,你能想到一个更好的解决方案吗?

3 个答案:

答案 0 :(得分:3)

在异步方法中放置Thread.Sleep可能会导致ThreadPool Starvation,因为它会在几秒钟内阻止有限数量的线程之一 - 该线程可能会关闭服务客户端请求。

相反,为什么不创建一个在五秒钟后触发的计时器?同样的效果,只需在计时器事件中记录您的延迟工作。

答案 1 :(得分:1)

虽然我发现您的问题陈述过于模糊而无法正确解决,但我可以说您应该使用System.Threading.Timer而不是Sleep语句。前者是高性能的,后者会使你的一个CPU核心处于繁忙状态(非常糟糕!)。

答案 2 :(得分:1)

让线程在Web服务器上休眠通常不是一个好主意,因为线程是有限的。在您的特定情况下,您需要一个客户端,每秒〜1-2个请求,以阻止所有线程......

您应该像其他人提议的那样使用计时器,并使用AsyncPage / AsyncHttpHandler来源。