C# ASP.NET网站中是否需要多线程?

C# ASP.NET网站中是否需要多线程?,c#,asp.net,multithreading,web-applications,C#,Asp.net,Multithreading,Web Applications,我正在构建一个简单的ASP.NET网站,该网站将通过第三方SMS API(通过URL推送)接收短信服务,然后该网站将通过将短信服务发送回发件人来确认发件人。我正在将传入的SMSE保存在数据库中。我已经实现了如下逻辑: public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //declaring vari

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

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处理多线程和类似方面的内容。所以,如果我有这样一个简单的网站,我需要处理多线程吗?或者页面加载函数/ASP.NET几乎可以自动处理它

如果答案是我不需要做任何事情,那就太棒了! 但是,如果我必须处理多线程,你能帮我提供一些关于如何处理的技巧吗?我希望有几千个SMSE


谢谢

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


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

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

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

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

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

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

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

作为一个例子,考虑下面的答案:


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


如果只有一个函数块,那么您将“必须”实现多线程,因为您必须为这些函数创建一个单独的线程,以便在页面加载()时并行运行处理正在进行。OTOA,如果它们是非阻塞的,则ASP.NET将在框架要求或强制的情况下通过在单独的线程中运行来处理它们。

“处理多线程和类似方面”-这是非常通用的。ASP.NET允许多个并发请求,但这并不意味着它“处理多线程”-例如,单个请求可能需要多个线程,而ASP.NET对此不负责。感谢您的帮助。我没有使用任何静态变量,因此我认为我很好。另外,请您澄清一下“如果遇到瓶颈,您可以增加并行发生的请求数。”。“有什么简单的方法吗?或者检查网站是否遇到瓶颈?谢谢。如果你最终被淹没,IIS/ASP.NET将开始失败请求,这些请求应该显示在HTTP和事件日志中。我只是在寻找这些,你可能无论如何都在这样做。”。