非同期 ASP.NET Httpハンドラことはじめ

最低限のテンプレートソースを作ってみた。IHttpAsyncHandler

Sleep(5000)のところに実際の処理を入れればよい。BeginとEndで違うスレッドになるかもしれないという話だったのだが、手元で数スレッド動かすような範囲では同じスレッド番号だった。

実際のコードではワーカースレッドで作ったデータをEndProcessRequest内で出力する。ワーカースレッド内で直接 Response.Write してもよさそうではあるが、現時点では確認していない。

public class Handler : IHttpAsyncHandler
{

    private HttpContext _context = null;
    public void ProcessRequest(HttpContext context)
    {
        throw new Exception("Never called");
    }

    public bool IsReusable
    {
        get { return true; }
    }

    private delegate void emptyDelegate();
    static readonly emptyDelegate emptyMethod = delegate()
    {
        Debug.WriteLine(String.Format("WorkerProcessRequest: ThreadID:{0}", Thread.CurrentThread.ManagedThreadId));
        Thread.Sleep(5000); // 時間のかかる処理のシミュレート
        return;
    };

    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
    {
        Debug.WriteLine(String.Format("BeginProcessRequest: ThreadID:{0}", Thread.CurrentThread.ManagedThreadId));
        _context = context;
        return emptyMethod.BeginInvoke(cb, extraData);
    }

    public void EndProcessRequest(IAsyncResult result)
    {
        Debug.WriteLine(String.Format("EndProcessRequest: ThreadID:{0}", Thread.CurrentThread.ManagedThreadId));
        if (result.IsCompleted && _context.Response.IsClientConnected)
        {
            _context.Response.ContentType = "text/plain";
            _context.Response.Write("Hello World");
        }
    }
}

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。