2014-02-25 70 views
0
public ActionResult AsyncAction() 
{ 
    Task task = new Task(httpContext => { 
     System.Web.HttpContext.Current = httpContext as HttpContext; 
     Thread.Sleep(1000 * 10); 
     var x = System.Web.HttpContext.Current.Request.Form["x"]; 
     //To do...Contains IO/NET Write/Read Operation... 
    }, System.Web.HttpContext.Current); 
    task.Start(); 
    return View(); 
} 

MSDN說:System.Web.HttpContext.Current在異步中是線程安全的嗎?

System.Web.HttpContext的任何公共static成員都是線程安全的 。

在我的代碼中是線程安全的?

+2

[你稱之爲「線程安全」的東西是什麼?](http://blogs.msdn.com/b/ericlippert/archive/2009/10/19/what-is-this-thing-you-call -thread-safe.aspx) –

+0

_「如果一段代碼在多線程同時執行期間正常工作,則它是線程安全的。」_我不會在這裏看到運行相同代碼的多個線程。 –

+0

System.Web.HttpContext.Current是否是線程安全的(我認爲不是)。如果您可以通過「異步」調用使用它,則不起作用。你也不應該使用ASP的線程。請參閱Stephen Cleary的博客文章。 – Aron

回答

0

你的代碼是線程安全的,但它寫得很奇怪。

Task task = new Task(httpContext => { 
    Thread.Sleep(1000 * 10); 
    var x = httpContext.Request.Form["x"]; 
    //To do...Contains IO/NET Write/Read Operation... 
}, System.Web.HttpContext.Current); 

總的來說,我喜歡Current儘可能少使用越好,而是周圍的語境傳遞明確:如爲什麼不寫。這樣,即使代碼異步調用,您的代碼也能正常工作。

除非你的問題是專門關於分配給Current屬性,並讓它在你的睡着時不被另一個線程改變?這看起來確實是一件安全的事情,但我找不到任何文檔來支持它,並且在Reflector中查看System.Web,這顯然不是不可能的(例如它沒有標記爲TheadLocal)。爲了安全起見,我會重寫如上。

1

它不是線程安全的,因爲您在多個線程上同時使用相同的HttpContext。文件沒有說明這是安全的。