Async / Await在ASP.NET核心控制器操作

时间:2017-12-19 04:29:01

标签: javascript c# asynchronous concurrency asp.net-core-mvc

您好我的控制器上有这个代码:

[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

2 个答案:

答案 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`)
    })  
}

是否有基于回调的函数来进行测试?