您好我的控制器上有这个代码:
[HttpGet]
[Route("/Test")]
public async Task<IActionResult> Test() {
Console.WriteLine("foo");
await Task.Delay(2000);
Console.WriteLine("bar");
return Ok();
}
尝试通过javascript进行测试:
for(let i=0; i<2; i++){
axios.get('/Test').then(response => {
console.log(`task ${i} finish`)
})
}
我希望服务器上的输出应该是:
foo
foo
foo
bar
bar
bar
但我得到的是:
foo
bar
foo
bar
foo
bar
我感到困惑的是,没有await Task.Delay(2000)
将控制流程返回进程并能够同时处理其他请求?在我看来,action方法不能同时处理大量请求。我误解了关于异步/等待的事情吗?如果我想模拟非阻塞冗长的Web服务调用,我应该实现什么?
I read this post but still can't figure out what is the solution
答案 0 :(得分:1)
ASP.NET很可能按顺序处理来自同一客户端的请求。意味着它在第一次进行时不会开始处理第二个请求。对于完整框架上的旧ASP.NET MVC来说确实如此,并且这样做是为了避免并发访问会话状态。可以通过应用SessionState(SessionStateBehaviour.Disabled)
属性来更改此行为。请检查此问题ASP.NET MVC and Ajax, concurrent requests?。也许类似的东西适用于ASP.NET Core。
我误解了关于异步/等待的事情吗?如果我想模拟非阻塞冗长的Web服务调用,我应该实现什么?
请求处理没有阻止。它们只是顺序的。如果您尝试从不同的客户端(浏览器)访问相同的操作,您将看到它们并行执行。
答案 1 :(得分:0)
我之前从未真正使用过axios,但从代码的外观来看,你的ASP.NET代码不是问题,它是javascript。
ASP.NET处理async / await非常好,在你的例子中它正在做正确的事情。问题是看起来你的javascript一次只做1个请求,等待结果(需要2秒)然后继续for循环。
for(let i=0; i<2; i++){
// this starts a request to /Test and waits the result
// since your controller waits 2 seconds before returning OK
// it looks like its sync
axios.get('/Test').then(response => {
console.log(`task ${i} finish`)
})
}
是否有基于回调的函数来进行测试?