出身背景

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相关问答推荐

DBSet 不包含 Where 的定义

.Net Framework:w3wp.exe 中的异常

log4net 记录所有未处理的应用程序错误

*不*使用 asp.net 会员提供程序是个坏主意吗?

SignalR + Autofac + OWIN:为什么 GlobalHost.ConnectionManager.GetHubContext 不起作用?

我可以在 .net 核心中使用 Entity Framework 6(非核心)吗?

在 appSettings 中存储字符串数组?

ASP.NET MVC 中的 ASP.NET AJAX 与 jQuery

免费的 ASP.Net 和/或 CSS 主题

为什么aspx文件会返回404(找不到页面)

如何在 ASP.NET 中仅在调试模式下执行代码

如何在 ASP.NET 页面中以编程方式生成 401 错误

ASP.NET Core 中的 NuGet 包位置在哪里?

如何验证 WebClient 请求?

ASP.NET MVC 路由的无限 URL 参数

MVC3 和实体框架

ContentResult 与字符串

根据条件更改 GridView 行 colored颜色

在 ASP.NET MVC 中模拟 User.Identity

SignalR 2.0 错误:无法加载文件或程序集 Microsoft.Owin.Security