出身背景

We are currently developing a web application, which relies on ASP .NET MVC 5, Angular.JS 1.4, Web API 2 and Entity Framework 6. For scalability reasons, the web application heavility relies on the async/await pattern. Our domain requires some cpu-intensive calculations, which can takes some seconds (<10s). In the past some team members used Task.Run, in order to speed up the calculations.Since starting an extra thread inside ASP .NET MVC or Web API controllers is considered a bad practise (the thread is not known by the IIS, so not considered on AppDomain Recycle => See Stephen Cleary's blog post), they used ConfigureAwait(false).

实例

public async Task CalculateAsync(double param1, double param2)
{
    // CalculateSync is synchronous and cpu-intensive (<10s)
    await Task.Run(() => this.CalculateSync(param1, param2))).ConfigureAwait(false);
}

问题

  • 使用Task有什么性能优势吗.在异步Web API控制器中运行cpu绑定的操作?
  • ConfigureAwait(false)真的避免了额外线程的创建吗?

推荐答案

使用Task.Run在异步Web API Controller中执行CPU受限操作是否有任何性能优势?

零.没有.事实上,您会通过产生新线程来影响性能.在Web应用程序的上下文中,派生线程与在"后台"运行不是一回事.这是由于Web请求的性质造成的.当有传入请求时,从池中取出一个线程来服务该请求.使用异步允许线程在请求if结束之前并且仅当线程处于等待状态即空闲时才被返回.派生一个线程进行工作,有效地空闲了主线程,允许它返回到池中,但是您仍然有一个活动线程.在这一点上,将原始线程返回到池不起任何作用.然后,当新线程完成其工作时,您必须从池中请求一个主线程,并最终返回响应.在all工作完成之前无法返回响应,因此无论您使用1个线程还是if个线程、异步还是同步,只有在所有工作完成后才能返回响应.因此,使用额外的线程只会增加开销.

ConfigureAwait(false)真的避免了额外线程的创建吗?

不,或者更恰当地说,这与此无关.ConfigureAwait只是一个优化提示,只决定在线程跳转之间是否保持原始上下文.总之,它与线程的创建无关,至少在ASP的上下文中是这样.NET应用程序对性能的影响可以忽略不计.

Asp.net相关问答推荐

Reaction-Native SignalR连接在调试模式下工作,在释放模式下失败

如何从 ASP.NET 中的代码隐藏文件访问 IFRAME?

带有 Web 套接字的 SignalR

在 ASP.NET 中更改错误消息的语言

Jquery asp.net 按钮单击事件通过 ajax

GridView 与嵌套类的属性绑定

当用户使表单无效时单击取消按钮时,如何清除 MVC 客户端验证错误?

如何解决 Kerberos 双跳问题?

如何设置 CSS 切换器

错误:无法在 Web 服务器上开始调试... ASP.NET 4.0

如何在 C# 中转换 TryCast?

缩小 ASP.NET 应用程序的 Html 输出

无法共同创建探查器错误 - 但未使用探查器

显示 ModalPopupExtender 时如何指定要运行的 javascript

ServiceStack 示例应该以什么顺序被理解?

如何保护存储在 web.config 中的密码?

会话存储在客户端还是服务器端

如何将列表转换为数据表

ASP.NET 中的嵌套中继器

重新生成designer.cs