【问题标题】:MVC Ajax request without blocking main thread不阻塞主线程的 MVC Ajax 请求
【发布时间】:2023-03-24 09:05:01
【问题描述】:

我在控制器里面有一些动作喜欢:

public class ValuesController : Controller
{
    [HttpPost]
    public string GetInfo()
    {
        Thread.Sleep(30000); // logics imitation
        return "result";
    }
}

当我在此操作上从客户端发送请求时,我将在等待“逻辑模仿”时收到“主线程阻塞”(如死锁) 我该如何预防? 已经试过了:

public class ValuesController : Controller
{
    [HttpPost]
    public async Task<string> GetInfo()
    {
        return await Task.Factory.StartNew(() =>
        {
            Thread.Sleep(30000);
            return "result";
        });;
    }
}

不工作...

已经看过 (ASP.NET MVC and Ajax, concurrent requests?),但 SessionState.ReadOnly 方式不适合我...

也尝试使用 .svc 服务代替控制器操作,但有同样的问题。

【问题讨论】:

  • 为什么要让线程休眠?
  • 因为我会“等待”外面的另一个结果。
  • 只是为了澄清 - 你真正想要完成的是什么?您是否只想让客户“一劳永逸”?是否要确保 ASP.Net 线程池中的线程可用于请求(而不是长时间运行的任务)?

标签: asp.net ajax asp.net-mvc multithreading


【解决方案1】:

默认情况下,MVC 会阻止并行会话,只有一种方法可以避免:

[SessionState(SessionStateBehavior.ReadOnly)]

Attribute on Controller 并通过使用写入和读取会话明确区分逻辑。

【讨论】:

    【解决方案2】:

    这个问题是我同事发的。是的,我们有需要“触发并忘记”的情况(我们试图异步调用动作,当同时执行不同的动作时,但我们仍然设法得到的是一个接一个地调用动作)

    【讨论】:

    • 如果您希望客户只提出请求而不担心有意义的响应,我建议您查看this question。简而言之 - 不用担心异步控制器。处理请求的线程启动一个新任务(或线程)并立即返回。那个新的任务或线程是为了它的业务。不利的一面是,除非您将其存储在某个地方,否则您实际上并不知道长期运行逻辑的结果。
    • 需要能够“一劳永逸”,但在等待“不返回空结果”后还需要可用的接收结果
    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 2023-03-24
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多