【发布时间】:2017-02-03 21:21:34
【问题描述】:
我有一个在 ASP.NET MVC 应用程序中使用的以下代码示例。 这段代码的目的是创建“一劳永逸”的请求,以便对一些长时间运行的操作进行排队。
public JsonResult SomeAction() {
HttpContext ctx = HttpContext.Current;
Task.Run(() => {
HttpContext.Current = ctx;
//Other long running code here.
});
return Json("{ 'status': 'Work Queued' }");
}
我知道这不是在异步代码中处理 HttpContext.Current 的好方法,但目前我们的实现不允许我们做其他事情。 我想了解这段代码有多危险......
问题:理论上是否有可能在Task.Run中设置HttpContext,将上下文设置为完全另一个请求?
我认为是的,但我不确定。我是怎么理解的: Request1 由线程池中的 Thread1 处理,然后当 Thread1 完全处理另一个请求(Request2)时,Task.Run 中的代码会将上下文从 Request1 设置为 Request2。
也许我错了,但我对 ASP.NET 内部原理的了解无法让我正确理解它。
谢谢!
【问题讨论】:
-
从 HttpContext 中获取您需要的信息,而不是传入整个 HttpContext 不是更简单吗? (我意识到这并不能回答你的问题,但我很好奇整个上下文的需要)。
-
是的,这是非常正确的方法,但不幸的是,目前我无法更改它。我们的代码可以访问 HttpContext.Current 深入的业务逻辑,而改变它是一项巨大的努力,目前我们还没有。
-
与您的问题无关 - 在 Web 上下文中长时间运行任务不是一个好主意 - 服务器可以重新启动并且池中只有这么多线程 - 一旦你用完线程你'将停止处理请求。你有考虑过像 HangFire 或 Quartz 这样的东西吗?
-
@OndrejSvejdar,你是对的,但这是我们目前拥有的,现在无法改变架构。
-
你有没有机会在 //Other long running code 中使用“await”。 ?
标签: asp.net asp.net-mvc asynchronous threadpool httpcontext