我正在构建一个简单的ASP.NET 网站,它将通过第三方SMS API(通过URL推送)接收短信,然后网站将通过向他们发送短信来确认发件人。我将传入的SMSes保存在数据库中。我已经实现了如下逻辑:
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几乎自动处理它?
如果答案是我不需要做任何事情,那就太棒了! 但是,如果我必须处理多线程,你能否请一些关于我应该如何处理的提示?我期待几千条短信。
感谢。
答案 0 :(得分:3)
默认情况下,对于每个进入的请求,ASP.NET都会获取一个线程池线程,创建一个Page类的新实例,并在该线程上调用相应的Page_Load和事件函数。它将同时为多个请求使用多个线程。请注意,static
成员和字段中的任何状态都已正确共享和同步。当然,如果可能,请避免共享状态。
如果已经处理了足够的请求,ASP.NET和IIS将开始拒绝请求,因此请确保您的处理时间足够快。如果遇到瓶颈,可以增加并行发生的请求数。如果你有真正高负载(比如每秒数百个请求),那么可以使用异步API来进一步增加正在进行的请求数量。但当然,开始时很简单,你可能会没事的。
答案 1 :(得分:0)
在这种特殊情况下,我认为会从ASP.Net应用程序中使用多线程获益。
首先让我解释多线程如何在ASP.Net中起作用
ASP.Net提供用于处理请求的固定数量的线程,当使用最大线程数时,传入请求将被放入阻塞Web应用程序的队列中。如果传入的请求一直到达服务器,则最终会出现服务不可用错误。
因此,提高应用程序可伸缩性的一种简单方法是释放ASAP用于处理您的请求的线程。
执行此操作的方法是创建异步页面(您也可以创建Async HttpHandler),当您创建Async页面时,将长时间消耗的进程放在另一个线程中,几乎立即释放ASP.Net线程。当您的进程完成后,将使用一个新线程来实例化您的页面的新实例(整个页面生命周期将不会运行,这意味着此过程更便宜),最后响应将发送到您的客户端。
正如您所看到的,由于您几乎立即释放ASP.Net线程,ASP.Net可以处理新的传入请求
例如,请考虑以下答案:
答案 2 :(得分:0)
在您的情况下要问的真正问题是:SomeLogicFunction()和SendSMSFunction()函数是阻塞还是非阻塞? (即它们是否会阻止更新代码,直到发送短信或恢复您的Page_Load()处理,同时继续异步发送消息?
如果一个函数阻塞,那么你将“必须”实现多线程,因为你必须创建一个单独的线程让这些函数在你的Page_Load()处理过程中并行运行。 OTOA,如果它们是非阻塞的,那么ASP.NET将通过在框架中需要或强制要求的单独线程中运行来处理它们。