2010-04-05 66 views
0

我看到這個代碼在一個項目中,我不知道它是安全的事:控制器和線程

(ASP.NET MVC 2.0)

class MyController 
{ 
    void ActionResult SomeAction() 
    { 
    System.Threading.Thread newThread = new System.Threading.Thread(AsyncFunc); 
    newThread.Start(); 
    } 

    void AsyncFunc() 
    { 
    string someString = HttpContext.Request.UrlReferrer.Authority + Url.Action("Index", new { controller = "AnotherAction" });  
    } 
} 

被重用控制器,可能改變HttpContext.Request和Url的內容,或者這很好(除了不使用線程池)。

感謝您的信息!

回答

0

即使這是有效的,現在工作正常,它似乎有風險。 API和/或底層實現可能會在將來的版本中更改,這可能會導致此代碼中斷。

一個更好的做法是在產卵時將任何所需的數據傳遞到SomeAction中的新線程。例如,通過使用ParameterizedThreadStart,如Passing Parameters to Threads中所示。

+0

這是正確的。 Controller類型(和HttpContext本身)不是線程安全的。這可能會引發異常,即使您只是在讀取數據。並且ThreadPool線程上的未處理異常可能會導致整個工作進程失效,從而導致您的應用程序碰巧正在服務的其他任何請求都被終止。 – Levi 2010-04-05 18:01:43

+0

但你不是說同樣的事情。賈斯汀認爲,當你認爲它可能拋出時,它應該是確定的(但不是一個好主意)。 – Rabbit 2010-04-06 07:48:00

+0

不,我所說的只是*即使*它現在工作正常......所以我認爲它可能會拋出:) – 2010-05-16 13:11:14