1

ASP.NETMVCアプリに取り組んでいます。イベントが発生したときにいくつかのスレッドを生成したかったのですが、スレッドの戻り値を気にせず、非同期呼び出しを行いたかったので、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

ThreadPoolASP.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 には、ThreadPool を直接使用する代わりに利用すべき AsyncController があると思います。

于 2010-01-01T10:16:57.023 に答える