gpt4 book ai didi

c# - 如何使 Controller Action 真正异步

转载 作者:太空宇宙 更新时间:2023-11-03 10:49:57 25 4
gpt4 key购买 nike

我有以下 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 Action 真正异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21784866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com