ASP.NET网站中需要多线程



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

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函数/AASP.NET几乎自动处理它?

如果答案是我什么都不需要做,那就太棒了!但是,如果我必须处理多线程,你能帮我提供一些关于我应该如何处理的提示吗?我预计会收到几千条短信。

谢谢。

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

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

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

让我首先解释一下多线程是如何在ASP.Net 中工作的

ASP.Net提供固定数量的线程用于处理请求,当使用了最大数量的线程时,传入的请求将被放置在队列中,可能会阻塞web应用程序。如果传入请求不断到达服务器,则最终会出现服务不可用错误。

因此,提高应用程序可伸缩性的一个简单方法是尽快释放ASP.Net用于处理您的请求的线程

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

正如您所看到的,由于您几乎可以立即释放ASP.Net线程,因此ASP.Net 可以处理新的传入请求

例如,考虑以下答案:

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

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

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

最新更新