我想我怎樣才能解決這個錯誤訪問HttpContext.Current在我的asp.net應用程序內如何訪問Task.Factory.StartNew中的HttpContext.Current?
Task.Factory.Start(() =>{
//HttpContext.Current is null here
});
?
我想我怎樣才能解決這個錯誤訪問HttpContext.Current在我的asp.net應用程序內如何訪問Task.Factory.StartNew中的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請求的生命週期和訪問HTT時,可能會導致有趣的結果請求完成後的PContext。
我喜歡用這種方式,而不是傳入狀態對象並將項目轉換爲單個變量......凌亂。 –
由於David指出,HttpContext.Current不會一直工作。在我的情況下,大約20次中有1次,CurrentContext將爲空。結束於下面。
string UserName = Context.User.Identity.Name;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
UserName ...
}
有趣的是,這對我來說確實很奇怪。例如,HttpContext的User屬性在進入線程後變爲null,儘管它在HttpContext.Current中有值。 – Giedrius
是的,值得注意的是,使用對HttpContext.Current的引用可能會工作很長時間,但不建議使用,並且有時可能會失敗。當http請求完成時,ASP運行時可能會清理對象,然後您會發現諸如'context.Items [x]'之類的內容不包含您之前放置的內容。另請參見http://stackoverflow.com/questions/8925227/access-httpcontext-current-from-threads – Rory