【发布时间】:2017-12-11 19:32:31
【问题描述】:
我一直在使用 async 关键字编写我的 Web Api 控制器方法,并且一直使用 async。我最近尝试进行方法同步以查看它如何影响性能,并震惊地发现它对任何其他 http 请求都没有阻塞影响。
举个例子-
[Route("Foo")]
class FooController {
[HttpGet("Hello")]
public string GetHello()
{
Thread.Sleep(100000); // 100 seconds
return "Hello";
}
[HttpGet("Goodbye")]
public string GetGoodbye()
{
return "Goodbye";
}
}
有了这个我可以运行GET => /Foo/Hello 后跟任意数量的GET => /Foo/Goodbye 并且我对Goodbye 端点的请求没有阻塞。
我最初认为我需要使 Hello 方法异步,以便对 Goodbye 端点的请求可以立即返回。但是使这个方法同步/异步没有效果!
非常困惑。 Web Api 应用程序不需要异步吗?为什么推荐?
【问题讨论】:
-
ASP.Net Core 使用多线程。
-
建议在 scale 上运行。当您的 ThreadPool 用完线程、您的网络服务器的队列已满并且请求被拒绝时,小规模的测试不会揭示发生的问题。明智地使用
async意味着您可以只使用少数线程为数千个并发客户端提供服务。现在尝试对服务器上 block 的请求执行相同操作....
标签: c# asynchronous asp.net-core