2

我正在构建一个简单的 ASP.NET网站,它将通过第 3 方 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 几乎可以自动处理它?

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

谢谢。

4

3 回答 3

3

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

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

于 2012-07-26T05:51:48.220 回答
0

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

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

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

因此,增加应用程序可伸缩性的一种简单方法是尽快释放 ASP.Net 用来处理您的请求的线程

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

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

例如,考虑以下答案:

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

于 2012-07-26T06:00:38.110 回答
0

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

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

于 2012-07-26T06:14:04.233 回答