1

我正在开发一个 ASP.NET MVC 应用程序。我想在事件发生时产生几个线程,我不关心线程的返回值,我想进行异步调用,所以我使用 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

以上所有代码都发生在同一个类中。只有事件处理函数在其他类中我需要在完成后杀死我的线程吗?如果我做错了什么,请建议我。

4

3 回答 3

1

ThreadPool在 ASP.NET 应用程序中使用 的正确方法是不使用它。ASP.NET 本身使用相同的ThreadPool,因此每当您将工作项排队时,您都会占用 ASP.NET 实际服务页​​面所需的资源。

为了完整起见,我将补充说,“首选”替代方案是简单地Thread为工作创建一个标准。您将不得不更加防御性地对工作方法进行编码,因为裸线程没有与线程相同级别的保护ThreadPool,但只要您这样做,您就会安全并且不会蚕食 ASP.NET 请求。

于 2009-12-31T22:05:37.397 回答
1

如果你想异步触发你的事件,你可以简单地在每个委托上调用 BeginInvoke。无需将其作为工作项排队。

于 2009-12-31T22:21:01.383 回答
0

我认为 ASP.NET MVC 2 中有 AsyncController,您应该利用它而不是直接使用 ThreadPool,

于 2010-01-01T10:16:57.023 回答