我有一个在ASP.NET MVC应用程序中使用的以下代码示例。 这段代码的目的是为排队一些长时间运行的操作创建“发送和忘记”请求。ASP.NET HttpContext.Current在Task.Run中
public JsonResult SomeAction() {
HttpContext ctx = HttpContext.Current;
Task.Run(() => {
HttpContext.Current = ctx;
//Other long running code here.
});
return Json("{ 'status': 'Work Queued' }");
}
我知道这是不是在异步代码处理HttpContext.Current一个很好的方式,但目前我们的实现不会让我们到别的做一些事情。 我想明白这个代码是多少危险......
问题:是理论上可能设置的HttpContext内Task.Run,将上下文设置为完全另一个请求?
我想是的,但我不确定。我的理解如下: Request1由线程池中的Thread1处理,然后当Thread1处理绝对另一个请求(Request2)时,Task.Run中的代码将设置上下文从Request1到Request2。
也许我错了,但是我对ASP.NET内部知识的了解并不能让我正确理解它。
谢谢!
从HttpContext获取所需的信息,而不是传入整个HttpContext会不会更简单? (我意识到这并不能回答你的问题,但我对整个上下文的需求感到好奇)。 – vcsjones
对,这是非常正确的方式,但不幸的是,目前我无法改变它。我们的代码可以访问HttpContext.Current内部的业务逻辑,并且改变它是目前我们没有的巨大努力。 –
与您的问题无关 - 在web上下文中执行长时间运行的任务并不是一个好主意 - 服务器可以重新启动并且池中只有很多线程 - 一旦线程用完,您将停止提供请求。你有没有考虑过像HangFire或Quartz? –