【问题标题】:Web.API 2 - Asynchronous execution of Requests [duplicate]Web.API 2 - 请求的异步执行 [重复]
【发布时间】: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。

我的问题如下:

  1. 返回 IHttpActionResult 与返回 Task 有什么好处吗?
  2. 我使用wcat性能工具在我的本地机器上测试了这两种方法,使用2个客户端和40个虚拟客户端,两种方法都得到了相似的结果。我希望使用第一种方法可以执行比第二种方法更多的请求。所以要么我的这个测试设置是错误的,要么我误解了异步/同步执行的效果?

期待您的回答!

【问题讨论】:

  • 第一个方法在不同的线程中等待。第二个阻塞当前线程。无论如何,更好的用法是 await Task.Delay(10) 而不是 Thread.Sleep(10) 第二个你浪费资源的线程被阻塞,什么都不做,第一个释放调用线程并在其他线程恢复工作点,就像 Javascript 中的承诺,当你等待时,你做出一个承诺,最终你会返回一些东西或异常
  • 我觉得这本书非常好,因为它很小而且很核Async in C# 5.0

标签: c# asp.net asynchronous


【解决方案1】:

如果您可以让您的网站处于负载状态,您只会看到运行 Async 方法的好处 - 即同时运行相当数量的请求。只需运行一次,您就会发现没有任何区别。

异步代码不会运行得更快;它允许系统管理其线程池并提高并发性 - 即可以更有效地使用可用线程。

参见 Stephen Cleary 的解释:

Async and Await

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多