ASP.NET(VB)异步执行长函数而不阻塞页面线程?

时间:2012-01-15 09:23:12

标签: asp.net vb.net asynchronous

我一直在阅读ASP.NET 3.5的异步功能/网页(我们还没有使用v4),但我看到的那些都专注于执行后台任务,但仍然回来完成在任务完成后发送并发送响应。

我想要做的只是启动后台任务(在这种情况下是对Web服务的调用),然后立即向浏览器返回响应 - 即。 没有等待异步任务完成。我甚至不需要知道它是否成功。

最好的方法是什么?我似乎无法找到在ASP.NET中开始你可能称之为“孤儿”后台任务的例子。

我想通过我向用户显示的页面上的javascript Ajax调用来实现它,但是传递给Web服务的信息是敏感的,所以这是不可能的。但这种说明了我想要做的事情。

[ed]另一个想法:在响应发送到浏览器并且连接关闭之后,我可以使用的ASP.NET模型中是否有一个事件出现?即。那么在没有用户等待的情况下可以进行更多处理?

2 个答案:

答案 0 :(得分:2)

您可以使用线程...如果您不关心响应,只需使用:

try
{
Thread t = new Thread(new ThreadStart(yourMethodName));
t.Start();
}
catch{}

答案 1 :(得分:1)

我已经对这个主题进行了相当多的探索,并且在ASP.Net中找不到真正异步的好答案或技巧。问题似乎是即使您使用下面列出的任何常用技术启动Async任务:

  • QueueUserWorkItem方法
  • 以Begin / End开头的异步辅助方法
  • System.Thread
  • 可能还有更多我不知道......

您仍然在创建一种情况,即您的网络应用程序可用的有限线程被阻止。 UI可能不会被阻止,但“ThreadPool”中的另一个线程肯定是。当每个线程需要快速提供请求时,这可能会导致应用程序在高流量期间窒息。

虽然这是额外的工作,但会有一系列维护问题。我建议将任何长时间运行的任务卸载到MSMQ队列,然后使用Windows服务处理队列上的任务。这将允许您的Web应用程序利用所有可用线程来提供请求,并且您卸载的任务将继续在后台处理。使用MSMQ的另一个好处是您可以将任务实际发送到完全不同的服务器。这有两个好处:

  • 您没有在运行应用的Web服务器上耗尽资源。
  • MSMQ和服务的潜在问题不一定会影响Web应用程序,可以在不触及运行应用程序的生产服务器的情况下进行调试和处理。

正如我所说,我知道这是一堆额外的工作,但如果你有一个高性能的网站,那么这将是一个更安全的赌注。目标是让Web服务器尽可能顺畅地运行,而不会因长时间运行的任务而陷入困境。