【问题标题】:Multi-threading required in ASP.NET websites?ASP.NET 网站需要多线程?
【发布时间】:2012-07-26 14:14:04
【问题描述】:

我正在构建一个简单的 ASP.NET 网站,它将通过 3rd 方 SMS API(通过 URL 推送)接收 SMS,然后网站将通过向发件人发回 SMS 来确认发件人.我将传入的短信保存在数据库中。我已经实现了如下逻辑:

public partial class _Default : System.Web.UI.Page
{    
    protected void Page_Load(object sender, EventArgs e)
    {
     //declaring variables to be used elsewhere, but in this same class. I have just this one class.  
     //Grabbing the URL parameters here (contents of SMS). 
     //Saving SMSes in the database. Database interaction happening only inside Page_Load. 
      //Call these functions
      SomeLogicFunction();
      SendSMSFunction(); 
    } 

    SomeLogicFunction()
    {
    }

    SendSMSFunction()
     {
     }
}

现在,我在某处读到 ASP.NET 处理多线程和类似方面。那么,如果我有这样一个简单的网站,我是否需要处理多线程?还是 Page_Load 函数/ASP.NET 几乎可以自动处理它?

如果答案是我不需要做任何事情,那就太棒了! 但是,如果我必须处理多线程,您能否提供一些关于我应该如何处理的提示?我预计会有几千条短信。

谢谢。

【问题讨论】:

  • “处理多线程和类似的方面” - 这是非常通用的。 ASP.NET 允许多个并发请求,但这并不意味着它“处理多线程”——例如,单个请求可能需要多个线程,而 ASP.NET 不对此负责。

标签: c# asp.net multithreading web-applications


【解决方案1】:

默认情况下,对于每个传入的请求,ASP.NET 都会获取一个线程池线程,创建 Page 类的新实例,并在该线程上调用适当的 Page_Load 和事件函数。它将同时为多个请求使用多个线程。请注意,您在static 成员和字段中的任何状态都已正确共享和同步。当然,尽可能避免共享状态。

如果已经处理了足够多的请求,ASP.NET 和 IIS 将开始拒绝请求,因此请确保您的处理时间足够快。如果遇到瓶颈,您可以增加并行发生的请求数量。如果您的负载真的很高(例如每秒数百个请求),您可以使用异步 API 来进一步增加正在进行的请求的数量。但是,当然,从简单开始,你可能会没事的。

【讨论】:

  • 感谢您的帮助。我没有使用任何静态变量,所以我认为我很好。另外,您能否澄清一下“如果遇到瓶颈,您可以增加并行发生的请求数量”。有什么简单的方法可以做到这一点吗?或检查网站是否遇到瓶颈?谢谢。
  • 如果您最终被淹没,IIS/ASP.NET 将开始失败请求,这应该会显示在 HTTP 和事件日志中。我只是在寻找那些你可能正在做的事情。
【解决方案2】:

在这种特殊情况下,我认为您将受益于在您的 ASP.Net 应用程序中使用多线程。

让我先解释一下多线程在 ASP.Net 中的工作原理

ASP.Net 提供了一个固定数量的线程用于处理请求,当使用了最大线程数时,传入的请求将被放入队列中,从而可能阻塞 Web 应用程序。如果传入的请求不断到达服务器,您最终会遇到 Service Unavailable 错误。

因此,提高应用程序可扩展性的一种简单方法是尽快释放 ASP.Net 用来处理您的请求的线程

一种方法,就是创建一个Async page(你也可以创建一个Async HttpHandler),当你创建一个Async页面时,将耗时较长的进程放到另一个线程中,几乎立即释放 ASP.Net 线程。当您的流程完成后,将使用一个新线程来实例化您的页面的新实例(但不会运行整个页面生命周期,这意味着此流程更便宜),最后将响应发送给您的客户端。

如您所见,由于您释放了 ASP.Net 线程,ASP.Net 几乎可以立即处理新的传入请求

例如,考虑以下答案:

https://stackoverflow.com/a/11525692/1268570

【讨论】:

    【解决方案3】:

    在您的案例中要问的真正问题是:函数 SomeLogicFunction() 和 SendSMSFunction() 是阻塞的还是非阻塞的? (即,它们是否会阻止进一步的代码,直到发送 SMS 或者它在继续异步发送消息的同时恢复您的 Page_Load() 处理?

    如果一个函数阻塞,那么你将“不得不”实现多线程,因为你必须为这些函数创建一个单独的线程,以便在你的 Page_Load() 处理过程中并行运行。 OTOA,如果它们是非阻塞的,那么 ASP.NET 将在框架需要或强制要求时通过在单独的线程中运行来处理它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多