メインスレッドをブロックした ASP.NET Web アプリケーションへの同時アクセス - IIS

メインスレッドをブロックした ASP.NET Web アプリケーションへの同時アクセスの挙動を確認します。

概要

ASP.NET Webアプリケーションでメインスレッドをブロックするアプリケーションに対して同時にアクセスした場合の動作を確認します。

プログラム

テスト用のプログラムで以下のコードを準備します。
ASP.NET アプリケーションを作成し、ジェネリックハンドラーを作成します。
index.ashx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WaitWebAppAspNetForm
{
  /// <summary>
  /// index の概要の説明です
  /// </summary>
  public class index : IHttpHandler
  {

    public void ProcessRequest(HttpContext context)
    {
      DateTime StartDt = DateTime.Now;

      System.Threading.Thread.Sleep(10000);

      DateTime EndDt = DateTime.Now;
      context.Response.Write(string.Format("Start {0} / End {1}",
        StartDt.ToString("hh:mm:ss.fff"), EndDt.ToString("hh:mm:ss.fff")));
    }

    public bool IsReusable
    {
      get
      {
        return false;
      }
    }
  }
}

解説

アクセス直後の日時をStartDtに代入します。
  DateTime StartDt = DateTime.Now;

Sleepメソッドを呼び出し10秒停止します。
  System.Threading.Thread.Sleep(10000);

処理終了の日時をEndDtに代入します。
  DateTime EndDt = DateTime.Now;

処理開始と終了の時刻をレスポンスとして返します。
  context.Response.Write(string.Format("Start {0} / End {1}",
    StartDt.ToString("hh:mm:ss.fff"), EndDt.ToString("hh:mm:ss.fff")));

補足:IISの設定

実行するASP.NET Webアプリケーションのアプリケーションプールのワーカープロセスは 1 で動作確認します。(Webガーデンを利用しない)

実行結果 (1端末でアクセス)

上記のプロジェクトを実行し、Webブラウザで index.ashx にアクセスします。アクセスしてから10秒ほど経過すると下図の画面が表示されます。
アクセス開始と処理終了時刻が表示されています。開始と終了で10秒の時間差があり、sleepメソッドで10秒停止していたことが確認できます。

実行結果 (1端末の複数ブラウザでアクセス)

続いて1つの端末で複数のブラウザを開き、同時にアクセスします。
30秒ほど経過すると3つのWebブラウザで下図の画面が表示されます。1つ目のブラウザの処理完了後に2つ目のブラウザの処理が開始していることがわかります。 3つ目のブラウザは2つ目のブラウザの処理完了後に処理を開始しています。

実行結果 (複数端末でアクセス)

続いて、複数の端末から同時にアクセスします。
それぞれのブラウザの画面が下図です。複数の端末からアクセスした場合はアクセスした時刻で処理が始まり、並列で処理が実行される動作が確認できます。




著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2021-01-30
iPentec all rights reserverd.