c# - 如何使 Controller 操作真正异步

标签 c# async-await asp.net-web-api2

我有以下 Controller :

public class PingController : ApiController 
{
    [Route("api/ping")]
    [HttpGet]
    public IHttpActionResult Ping()
    {
        var log = HostLogger.Get(typeof(PingController));
        log.Info("Ping called.");
        return Ok("Ping succeeded @ " + DateTime.UtcNow);
    }

    [Route("api/long-ping")]
    [HttpGet]
    public async Task<IHttpActionResult> LongPing(CancellationToken cancelToken)
    {
        await Task.Delay(30 * 1000);
        return Ok("Ping succeeded @ " + DateTime.UtcNow);
    }
}

如果我执行 LongPing,然后在不同的浏览器选项卡中执行 Ping,则 Ping 将在 LongPing 之前执行并返回 - 这正是我正在寻找的。问题是,当我执行两个 LongPing 调用时,第二个调用大约需要 60 秒才能完成(而不是 30 秒)。 Chrome 报告第二个调用的延迟为 58 秒(60 秒减去我启动第二个请求所需的时间)。在我看来,如果我的工作正常的话,两个 LongPing 调用应该在 30 秒左右执行。

我还应该提到,我将其托管在 OWIN 托管环境中,而不是 IIS。但我认为这没有什么区别,但也许有人会证明我错了。

如何让 LongPing 真正表现得像异步请求?

最佳答案

很可能是您的 session 状态导致了您的问题。对于这种行为有一个冗长的解释,但简短的版本是,特定的用户 session 一次只能执行一个请求,因为 session 状态锁定以确保状态一致。如果您想加快速度,请禁用 cookie 来测试 session 状态假设(这样每个请求您将获得 1 个 session 状态),或者禁用应用程序中的 session 状态。否则,您的代码是异步明智的。

关于c# - 如何使 Controller 操作真正异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21784866/

相关文章:

c# - SQL输出参数

c# - Fire and Forgot 的异步/等待方法

cors - 启用 CORS 的 Web Api 2 facebook 身份验证

c# - 如何在 EF6 异步中启动实体存储过程而不等待返回?

node.js - 使用 async/await 冒泡和捕获异常的正确模式是什么?

file-upload - 如何解决 postman 中的文件上传错误?

c# - 使用 MVVMLight 时如何设置 Web API DependencyResolver

C# Asp.Net 用户控件按钮单击

c# - 如何在 .net 日历控件中显示事件链接?

c# - 您可以在运行时更改 Foo.settings 文件中的设置吗?