【问题标题】:ASP.NET (VB) Performing a long function asynchronously without blocking the page thread?ASP.NET (VB) 在不阻塞页面线程的情况下异步执行长函数?
【发布时间】:2012-01-15 23:42:24
【问题描述】:

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

我想要做的只是启动后台任务(在本例中是对 Web 服务的调用),然后立即向浏览器返回响应 - 即。 无需等待异步任务完成。我什至不需要知道它是否成功。

最好的方法是什么?我似乎找不到在 ASP.NET 中启动您可能称之为“孤立”后台任务的示例。

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

[ed] 另一个想法:在我可以使用的 ASP.NET 模型中是否有一个事件发生在响应已发送到浏览器并关闭连接之后? IE。这样就可以进行更多的处理而无需用户等待?

【问题讨论】:

    标签: asp.net vb.net asynchronous


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,没想到这么简单。 :) 但是,在调查了这些选项之后,我不清楚 a)Dim th As New Thread(New ThreadStart(Function() DoWork(param)))、b)Dim th As New Thread(DirectCast(Function() DoWork(param), ThreadStart)) 和 c)ThreadPool.QueueUserWorkItem(Function() DoWork(param)) 之间的区别。它们的功能似乎都一样。
    • 如果我理解正确,使用 ThreadPool.QueueUserWorkItem 对 ASP.NET 不利,因为它将使用专用于处理请求的线程并且加载过多会导致您的站点出现问题。当您使用线程时,它不使用 ASP.NET 线程池,因此您可以处理相同数量的请求。但正如@ss4526 所说,最好的办法是将事物分开,但这完全是另一回事:) 使用 WCF 代替 MSMQ :)
    【解决方案2】:

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

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

    您仍在创造一种情况,即您的网络应用程序可用的有限线程被阻止。 UI 可能不会出现阻塞,但“线程池”中的另一个线程肯定是阻塞的。这可能会导致您的应用程序在高流量期间阻塞,此时每个线程都需要快速处理请求。

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

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

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

    【讨论】:

    • 感谢您,但是在共享服务器上,我在理想情况下可以实现的目标有限。我决定开始一个新线程。由于主线程(为页面提供服务)在启动新线程后立即退出,我认为整个 IIS 池中的线程不会“丢失”。
    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多