私は現在、カスタムHttpHandlerを開発しています(CSSを圧縮/結合するためですが、この質問には関係ありません)。
私は、誰もが知っているような単純なreusable=true同期HttpHandlerから始めました。
今、私はそれを非同期ハンドラーに改善しようとしています(IO機能を使用し、非常に忙しいWebサイトで使用されているため)。
私の最初の試み(そしてこれはうまくいくようです):
Action<HttpContext> asyncProcessRequest;
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
asyncProcessRequest = new Action<HttpContext>(ProcessRequest);
return asyncProcessRequest.BeginInvoke(context, cb, extraData);
}
public void EndProcessRequest(IAsyncResult result)
{
asyncProcessRequest.EndInvoke(result);
}
public virtual void ProcessRequest(HttpContext context)
{
// real work
}
これは再利用不可能なhttphandlerです(私が読んだところによると、このハンドラーには状態(asyncProcessRequestフィールド)があるため、IsReusableはfalseである必要があります。
今、私はこれを再利用可能にしたいです。したがって、私の最初の考えは、次のようなIAsyncResult/Actionの辞書を作成することでした。
IDictionary<IAsyncResult, Action<HttpContext>> asyncProcessRequests;
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
if (asyncProcessRequests == null)
{
asyncProcessRequests = new Dictionary<IAsyncResult, Action<HttpContext>>();
}
var request = new Action<HttpContext>(ProcessRequest);
var result = request.BeginInvoke(context, cb, extraData);
asyncProcessRequests.Add(result, request);
return result;
}
public void EndProcessRequest(IAsyncResult result)
{
Action<HttpContext> action;
if (asyncProcessRequests.TryGetValue(result, out action))
{
action.EndInvoke(result);
}
}
これは正しいパターンですか?または私は道を離れていますか?
動作しているようですが(エラーや奇妙な動作は発生していません)、これを本番環境に移行する前に、これらのHttpハンドラーの作成に私よりも経験のある人に確認したいと思います。
前もって感謝します!