首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么AsyncController让我的服务器停止工作?

为什么AsyncController让我的服务器停止工作?
EN

Stack Overflow用户
提问于 2013-01-25 04:10:15
回答 1查看 108关注 0票数 3

我最近对我的一个ASP.NET MVC3控制器进行了一些(相当小的)更改,并将其中一个操作更改为异步操作。基本上,我的代码看起来像这样:

代码语言:javascript
复制
public ActionResult MyAction(BindingObject params){
    // use HttpWebRequest to call an external API and process the results
}

并将其转换为如下代码:

代码语言:javascript
复制
private delegate ActionResult DoMyAction(BindingObject params);

public void MyActionAsync(BindingObject params){
    AsyncManager.OutstandingOperations.Increment();
    var doMyAction = new DoMyAction(MyAction);
    doMyAction.BeginInvoke(params, MyActionCallback, doMyAction);
}

private void MyActionCallback(IAsyncResult ar){
    var doMyAction = ar.AsyncState as DoMyAction;
    AsyncManager.Parameters["result"] = doMyAction != null ? doMyAction.EndInvoke(ar) : null;
    AsyncManager.OutstandingOperations.Decrement();
}

public ActionResult MyActionCompleted(ActionResult result){
    return result;
}

private ActionResult MyAction(BindingObject params){
    // use HttpWebRequest to call an external API and process the results
}

这似乎工作得很好,当我在本地调用MyAction对其进行测试时,每个方法中的断点都会在我期望它们触发时触发,并最终返回预期的结果。

我预计这一变化最多只能提高高负载下的性能,因为现在我的工作线程不会因为等待HttpWebRequest调用外部API而被占用,而且在最坏的情况下根本没有任何影响。

在推动此更改之前,我的服务器的CPU使用率平均在30%左右,而我的W3SVC_W3WP活动请求性能统计在10-15左右。服务器是Win Server2008MVC,R2站点每秒收到大约50个请求。

在推动此更改时,CPU的使用率将达到90%-100%,W3SVC_W3WP活动请求计数器缓慢增加,直到达到最大值5000并保持不变。网站变得完全无响应(超时或出现“服务不可用”错误)。

我的假设是,我要么错误地实现了AsyncController,错过了一些必需的额外配置,要么只是误解了AsyncController应该用来做什么。无论如何,我的问题是为什么会发生这种情况?

EN

回答 1

Stack Overflow用户

发布于 2013-01-25 04:34:55

通过异步调用委托,您可以将工作移动到线程池。你还是会烧掉一根线。您什么也得不到,性能也不高。

当您可以触发真正的异步IO时,异步最有意义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14509848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档