【发布时间】:2017-09-28 10:14:29
【问题描述】:
我目前正在调查一个项目是否存在以下方法的显着性能差异:
[HttpGet]
public async Task<IHttpActionResult> Test1()
{
await Task.Delay(TimeSpan.FromSeconds(10));
return Ok();
}
和
[HttpGet]
public IHttpActionResult Test2()
{
Thread.Sleep(TimeSpan.FromSeconds(10));
return Ok();
}
在我的理解中,第一种方法Test1是异步执行的,这意味着等待task.delay的结果,当前线程可以被其他请求重用。
第二种方法Test2同步执行,线程阻塞10秒。然而,OK 结果是异步执行的,因为我的返回类型是 IHttpActionResult。
我的问题如下:
- 返回 IHttpActionResult 与返回 Task 有什么好处吗?
- 我使用wcat性能工具在我的本地机器上测试了这两种方法,使用2个客户端和40个虚拟客户端,两种方法都得到了相似的结果。我希望使用第一种方法可以执行比第二种方法更多的请求。所以要么我的这个测试设置是错误的,要么我误解了异步/同步执行的效果?
期待您的回答!
【问题讨论】:
-
第一个方法在不同的线程中等待。第二个阻塞当前线程。无论如何,更好的用法是 await Task.Delay(10) 而不是 Thread.Sleep(10) 第二个你浪费资源的线程被阻塞,什么都不做,第一个释放调用线程并在其他线程恢复工作点,就像 Javascript 中的承诺,当你等待时,你做出一个承诺,最终你会返回一些东西或异常
-
我觉得这本书非常好,因为它很小而且很核Async in C# 5.0
标签: c# asp.net asynchronous