2

私は単純な ASP.NET Web サイトを構築しています。この Web サイトは、サード パーティの SMS API を介して (URL プッシュを介して) SMS を受信し、Web サイトは 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 がマルチスレッドや同様の側面を処理することをどこかで読んだことがあります。では、このような単純な Web サイトがある場合、マルチスレッドを処理する必要がありますか? または、Page_Load 関数/ASP.NET はほとんど自動的に処理しますか?

何もする必要がないという答えがあれば、それはそれで素晴らしいことです。しかし、マルチスレッドを処理する必要がある場合は、どのようにアプローチすればよいか、いくつかのヒントを教えてください。数千の SMS を期待しています。

ありがとう。

4

3 に答える 3

3

既定では、着信する要求ごとに、ASP.NET はスレッド プール スレッドを取得し、Page クラスの新しいインスタンスを作成し、そのスレッドで適切な Page_Load およびイベント関数を呼び出します。複数のリクエストに対して同時に複数のスレッドを使用します。staticメンバーとフィールドの状態が適切に共有および同期されていることに注意してください。もちろん、可能であれば共有状態は避けてください。

ASP.NET と IIS は、処理中の要求が十分にある場合、要求を拒否し始めるため、処理時間が十分に速いことを確認してください。ボトルネックが発生した場合は、並行して発生するリクエストの数を増やすことができます。負荷が非常に高い場合 (たとえば、1 秒あたり数百のリクエスト)、処理中のリクエストの数をさらに増やすために使用できる非同期 API があります。もちろん、簡単なことから始めれば、おそらく大丈夫でしょう。

于 2012-07-26T05:51:48.220 に答える
0

この特定のケースでは、ASP.Net アプリケーションでマルチスレッドを使用するとメリットがあると思います。

最初に、ASP.Net でマルチスレッドがどのように機能するかを説明しましょう。

ASP.Net は、要求を処理するために使用される固定数のスレッドを提供します。最大数のスレッドが使用されると、着信要求がキューに配置され、Web アプリケーションをブロックする可能性があります。着信要求がサーバーに届き続けると、Service Unavailableエラーが発生します。

したがって、アプリケーションのスケーラビリティを高める簡単な方法の 1 つは、ASP.Net が要求を処理するために使用するスレッドをできるだけ早く解放することです。

これを行う方法は、非同期ページを作成することです (非同期 HttpHandler を作成することもできます)。非同期ページを作成すると、時間のかかるプロセスが別のスレッドに配置され、ASP.Net スレッドがすぐに解放されます。プロセスが完了すると、新しいスレッドを使用してページの新しいインスタンスがインスタンス化されます (ただし、ページのライフ サイクル全体は実行されないため、このプロセスのコストは低くなります)。最後に、応答がクライアントに送信されます。

ご覧のとおり、ASP.Net スレッドを解放すると、ほぼ即座に新しい着信要求を ASP.Net で処理できます。

例として、次の答えを考えてみましょう。

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

于 2012-07-26T06:00:38.110 に答える
0

あなたの場合に尋ねる本当の質問は、関数 SomeLogicFunction() および SendSMSFunction() がブロックされているか、ブロックされていないかということです。(つまり、SMS が送信されるまでさらにコードをブロックしますか、それとも非同期でメッセージを送信し続けながら Page_Load() 処理を再開しますか?

1 つの関数でもブロックする場合は、マルチスレッドを実装する必要があります。これは、Page_Load() 処理の進行中にこれらの関数を並列に実行するために別のスレッドを作成する必要があるためです。OTOA、それらが非ブロッキングである場合、ASP.NET は、フレームワークによって必要または義務付けられている場合、別のスレッドで実行することによってそれらを処理します。

于 2012-07-26T06:14:04.233 に答える