【问题标题】:Changing my server-side WebAPI to get the benefits of async/await更改我的服务器端 WebAPI 以获得 async/await 的好处
【发布时间】:2014-07-18 14:30:57
【问题描述】:

试图了解服务器端 async/await 的使用。我的理解是只有当线程可以被释放时才有用。 如果我有:

[HttpGet]
public async Task<IEnumerable<MyObject>> Get()
{        
     return await Task<IEnumerable<MyObject>>.Run(() => DoThingsAndGetResults());
}

IEnumerable<MyObject> DoThingsAndGetResults()
{
    // ...Do some CPU computations here...

    IEnumerable<MyObject> result = myDb.table.Select().ToList(); // entity framework

    // ...Do some CPU computations here...

    return result;
}

线程会被释放吗?在这种情况下 Async/Await 没用吗?从 async/await 中获益的唯一方法是,如果我做一些更大的改变并这样做:

[HttpGet]
public async Task<IEnumerable<MyObject>> Get()
{        
     return await DoThingsAndGetResultsAsync();
}

async IEnumerable<MyObject> DoThingsAndGetResultsAsync()
{
    // ...Do some CPU computations here...

    IEnumerable<MyObject> result = await myDb.table.Select().ToListAsync(); // entity framework

    // ...Do some CPU computations here...

    return result;
}

【问题讨论】:

标签: c# asp.net-web-api async-await


【解决方案1】:

如果你想要实现的是释放线程,第二个例子更好。第一个在整个操作过程中持有一个线程。

说明

async-await 所做的只是帮助您编写异步运行但“看起来”同步的代码。

异步代码有2个原因:

  1. 卸载。主要用于GUI 线程或其他“更重要”的线程”。(在等待 CPU 操作完成时释放线程)。
  2. 可扩展性。主要用于服务器端以减少资源使用。 (在等待 IO 完成时释放线程)。

不出所料,原因与您的示例相符。

在第一个示例中,您在不同的线程上运行DoThingsAndGetResults(使用Task.Run)并等待它异步完成。第一个线程正在被释放,但第二个没有。

在第二个中,您一次只使用 1 个线程,并在等待 IO(实体框架)时释放它。

【讨论】:

  • 所以(我需要说明一下)第一个代码块中的 async/await 用法是无用的,因为它既不提供卸载,也不提供可扩展性?
  • @Steve 它确实提供卸载,但没有明显的原因,所以是的......它没用。
【解决方案2】:

使用异步操作进行长时间运行的 io 操作服务器端的好处之一,就像数据库调用一样,是您可以释放线程处理请求,以便 Web 服务器有更多可用线程来处理新的要求。请注意,在使用默认任务调度程序时这是正确的,它在线程池中的可用线程上调度任务。当使用另一个任务调度器时,效果可能会有所不同...

【讨论】:

    【解决方案3】:

    当您必须等待 IO 操作(从文件读取、查询数据库、从 Web 服务器接收响应)时,异步方法最有用。

    例如,当您的数据库提供程序支持像 Entity Framework 6 这样的异步查询时,可以使用异步。尽管它对于 CPU 绑定操作(计算等)不是很有用。

    ASP.NET MVC4 Async controller - Why to use?查看相关答案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多