2009-12-31 81 views
1

我正在研究ASP.NET MVC應用程序。 我希望當一個事件發生時產卵線程數,我不關心的返回值我線程 ,我想作一個異步調用,所以我使用ThreadPool.QueueUserWorkItem,我正在使用ThreadPool.QueueUserWorkItem嗎?

public event SomeEventHandler SomeEvent; 

private void SomeEventhappened(UserProfile arg) 
     { 
      SomeEventHandler handler = SomeEvent; 
      if (handler != null) 
      { 
      // handler(currentUser); 
      foreach (SomeEventHandler wc in handler.GetInvocationList()) 
      { 
       SomeEventHandler wc2 = wc; 
       ThreadPool.QueueUserWorkItem(
        delegate { wc2(arg); } 
       ); 
      } 
      } 
     } 

我已附上事件處理函數的事件

我這是怎麼提高的情況下,

this.SomeEventhappened(userProfile); //Here the event is raised 

所有上面的代碼在同一個班級發生的事情。只有事件處理函數在其他類中 完成後是否需要殺死我的線程? 如果我做錯了什麼,請建議我。

+0

大約只調用「調用」是什麼? – 2009-12-31 22:32:57

回答

1

在ASP.NET應用程序中使用ThreadPool的正確方法是not to use it。 ASP.NET本身使用相同的ThreadPool,所以無論何時排隊工作項,您都將拿走ASP.NET實際提供頁面所需的資源。

爲了完整起見,我會補充說,「首選」替代方案是簡單地爲工作創建一個標準Thread。您必須更加防禦地編寫工作方法,因爲裸線程不具有與ThreadPool線程相同的保護級別,但只要您這樣做,就可以保證安全,並且不會影響ASP.NET請求。

1

如果你想異步啓動你的事件,你可以簡單地在每個代理上調用BeginInvoke。無需將其排列爲工作項目。

+0

如果我使用BeginInvoke,我還必須調用EndInvoke,我也不想這麼做 – San 2009-12-31 22:25:20

0

我認爲有AsyncController在ASP.NET MVC 2,你應該好好把握,而不是直接使用線程池的,