3

クライアントのパフォーマンスを向上させるために、リクエストの処理をタスクにオフロードします。これは通常、処理に少し時間がかかるため、200 応答を取得するためだけにクライアントをしばらく待たせたくないためです。作業をタスクにオフロードする Web サービスは、常にポストを処理しています。

public void ProcessRequest(HttpContext context)
{
    // check for bad requests -- return 400

    // get copy of the context input stream

    Task.Factory.StartNew(() =>
    {
        ProcessRequest(contextInputStreamCopy);
    });
}

private void ProcessRequest(Stream inputStream)
{
    try
    {
        // process input stream
    }
    catch(Exception ex)
    {
        // any server error that would normally result in 500 response are not
        // exposed to the clients, the clients are to see 200 when the server 
        // encounters an error
    }
}

私の質問は、IIS がリサイクルされたとき、または Web サイトが停止されたときに、これらのタスクがどうなるかということです。

4

2 に答える 2

6

IIS がリサイクルするとき、すべてのスレッドが終了して終了するのを待機します (最大でプールにあるタイムアウト値まで)。そのタイムアウトの後、実行中のすべてのスレッドを強制終了し、再び開始します。

globa.asaxそのため、関数の使用時にアプリケーションがシャットダウンを要求したときに停止するようにスレッドにシグナルを設定できますApplication_End

于 2013-01-25T17:27:02.127 に答える
4

IIS のリサイクル時に実行中のタスクがどうなるか

IIS がリサイクルされると、それに応じて実行中のタスクが停止するだけです。タスクに少し時間がかかる場合は、別のプロセスでタスクを実行することを検討する必要があります。修正方法は、キュー (MSMQ、RabbitMQ...) を使用してタスクを保存し、別のプロセスを使用してキューからタスクを選択して実行することです。これには、スケジューラで Windows サービスまたはコンソール ホストを使用できます。

Phil Haack からの詳細情報:

ASP.NET が AppDomain を破棄すると、既存の要求をフラッシュして、アプリケーション ドメインを破棄する前に完了する時間を与えようとします。ASP.NET と IIS は、要求の一部として実行されるコードなど、実行中であることがわかっているコードに配慮しています。

問題は、ASP.NET が、タイマーまたは同様のメカニズムを使用して生成されたバックグラウンド スレッドで行われた作業を認識していないことです。リクエストに関連付けられた作業のみを認識します。

于 2013-01-25T17:26:47.597 に答える