但是,使用ASP.NET Web Api,如果您的请求是在一个上面 线程,等待一些函数并调用
ConfigureAwait(false)
这可能会让你在不同的线程上 返回ApiController函数的最终结果。实际上,只做一个
await
就可以做到这一点。一旦您的async
方法点击 一个await
,该方法被阻止但线程返回到该线程 池。当方法准备好继续时,将抢夺任何线程 从线程池中用来恢复方法。
我刚刚在控制台程序中对其进行了测试:
async Task foo()
{
int y = 0;
while (y<5) y++;
}
async Task testAsync()
{
int i = 0;
while (i < 100)
{
Console.WriteLine("Async 1 before: " + i++);
}
await foo();
while (i < 105)
{
i++;
Console.WriteLine("Async 1 after: " + i);
}
}
调用await foo()
不会导致线程testAsync
正在运行以返回线程池,testAsync
只是从头到尾在同一个线程上逐行运行。我在这里错过了什么?
答案 0 :(得分:7)
我在这里错过了什么?
您缺少编译器警告
警告CS1998此异步方法缺少'await'运算符并将同步运行。考虑使用'await'运算符等待非阻塞API调用,或'await Task.Run(...)'在后台线程上执行CPU绑定工作。
答案 1 :(得分:0)
方法foo
并非真正异步,因为其中没有await
次调用
尝试在其中添加await Task.Delay
。