如何在 Task.Factory.StartNew 中访问 HttpContext.Current
本文关键字:访问 HttpContext Current StartNew Factory Task | 更新日期: 2023-09-27 18:34:35
我想在我的 asp.net 应用程序中访问 HttpContext.Current
Task.Factory.Start(() =>{
//HttpContext.Current is null here
});
如何修复此错误?
Task.Factory.Start
将启动一个新Thread
,并且由于HttpContext.Context
是线程的本地,因此它不会自动复制到新Thread
,因此您需要手动传递它:
var task = Task.Factory.StartNew(
state =>
{
var context = (HttpContext) state;
//use context
},
HttpContext.Current);
您可以使用闭包使其在新创建的线程上可用:
var currentContext = HttpContext.Current;
Task.Factory.Start(() => {
// currentContext is not null here
});
但请记住,任务的寿命可能超过HTTP请求的生存期,并且在请求完成后访问HTTPContext时可能会导致有趣的结果。
正如David指出的那样,HttpContext.Current不会一直工作。就我而言,大约 20 次中的 1 次,CurrentContext 将为空。最后是下面。
string UserName = Context.User.Identity.Name;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
UserName ...
}