2009-12-31 59 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,你应该好好把握,而不是直接使用线程池的,