【发布时间】:2018-01-25 00:16:00
【问题描述】:
我正在尝试使我的 WebApi 异步,以免在访问数据库时阻止 ASP.net 线程处理请求。所以我创建了以下代码。据我了解,当调用此操作时,将创建一个远离 ASP.net 线程池的新线程来处理 GetBalance 方法,并且过去处理此操作请求的线程将被释放并返回到池中,直到由其他请求使用,直到 GetBalance 方法完成其 IO。这是正确的吗?
我读过的一些文章表明,我的异步调用必须一直遍历所有调用链,直到达到最低级别的异步调用,在本例中为实体框架异步调用。否则,由下面的代码创建的新线程仍将在 ASP.net 线程池中创建,我将释放一个线程来占用另一个线程,这破坏了在异步等待中为提高此 WebApi 的可伸缩性所做的全部努力。
谁能解释一下它是如何工作的?如果我的理解是正确的?
public async Task<Account> Balance(int number)
{
Task<Account> task = GetBalanceAsync(number);
await task;
return task.Result;
}
Task<Account> GetBalanceAsync(int number)
{
return Task.Factory.StartNew(() => GetBalance(number));
}
Account GetBalance(int number)
{
using (AccountServices accountService = new AccountServices())
{
Account account = accountService.Find(number);
return account;
}
}
【问题讨论】:
标签: c# asp.net asynchronous async-await