gpt4 book ai didi

c# - 可重用异步 HttpHandler 的模式

转载 作者:太空狗 更新时间:2023-10-29 21:37:02 24 4
gpt4 key购买 nike

我目前正在开发一个自定义的 HttpHandler(用于压缩/组合 CSS,但这对这个问题无关紧要)。

我从众所周知的简单 reusable=true 同步 HttpHandler 开始。

现在我正在尝试将其改进为异步处理程序(因为它使用 IO 功能并且在非常繁忙的网站上使用)。

我的第一次尝试(这似乎工作正常):

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(根据我的阅读,IsReusable 应该是 false,因为这个处理程序有状态(asyncProcessRequest 字段)。

现在我想让它可以重复使用。所以我的第一个想法是创建一个 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 处理程序方面比我更有经验的人进行验证..

提前致谢!

最佳答案

通常,对于异步模式,您应该使用传递给 BeginXxx 方法的状态参数作为最后一个参数(您将其称为 extraData)。

因此您可能想要创建一个帮助程序类来保存(原始的)extraData 以及处理请求结束所需的任何其他状态。

但是,在您的特定情况下,我相信您不会通过使用异步模式来加速任何事情。虽然它有效,但它基本上只会增加开销,因为您正在以异步方式调用委托(delegate),它只会将调用分派(dispatch)到线程池以处理调用。因此,只要您没有通过异步调用同时运行多个委托(delegate),您就不会受益太多。由于 Web 请求已经是多线程的,我认为这对性能没有帮助;相反,您会遇到线程池饥饿的风险。

正确高效的异步处理并不容易。如果您正在执行固有的异步操作,例如从文件或网络连接读取数据,或者在调用支持异步调用的外部组件(例如 Web 服务调用或数据库)时,您可以从中受益。

关于c# - 可重用异步 HttpHandler 的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com