2

たとえば、次のようなイベントがあります。

public event EventHandler<NewReadyMessageEventArgs> NewReadyMessage

問題は、2 つのハンドラーをアタッチする必要があり、1 つを別のハンドラーの前に実行する必要があることです (最後のハンドラーは最初のハンドラーに依存するため)。つまり、特定の順序でハンドラを実行する必要があります。

実際にはハンドラーが 1 つずつ実行されることを理解しているので、正しい順序でハンドラーをアタッチする必要があるだけですが、それは非常にエラーが発生しやすい設計になります。

別のハンドラーを作成してアタッチしたい。このハンドラーでは、2 つのハンドラーを正しい順序で実行したいだけです。あなたは何を考え、何を提案しますか?

4

4 に答える 4

7

問題は、2 つのハンドラーをそれにアタッチする必要があり、1 つを別のハンドラーの前に実行する必要があることです (最後のハンドラーは最初のハンドラーに依存するため)。

この場合、私はあなたのデザインを再考します。「最初の」ハンドラーが独自のイベントを発生させる方が理にかなっている可能性があります。

2 番目のハンドラーはそのイベントにアタッチし、両方の項目の結果を取得できます。

于 2012-08-20T18:51:34.107 に答える
2

ハンドラーが特定の順序で呼び出されるようにするために、内部実装に依存することはありません。

ハンドラーがお互いを認識できないが、特定の順序で実行する必要がある場合は、他の 2 つのハンドラーを正しい順序で呼び出す「親」ハンドラーを作成します。

于 2012-08-20T18:53:03.207 に答える
1

デフォルトのイベント/実装addでデフォルトのマルチキャスト デリゲートが必要ない場合は、独自の実装を実装することをお勧めします。addremove

詳細については、http://msdn.microsoft.com/en-us/library/cc713648.aspxを参照してください。

明らかでない場合、デフォルトのマルチキャスト デリゲートを使用しない場合は、サブスクライバーの呼び出しを手動で実装する必要があります。上記のリンクでは、マルチキャスト デリゲートを使用するためのカスタムの追加/削除の記述方法について詳しく説明しています。この回答は、マルチキャスト デリゲートを使用しないことを前提としています 。たとえば、次のようなものです。

   private List<EventHandler> eventList = new List<EventHandler>();

   public event EventHandler Event1 
   {
      add { eventList.Add(value); }
      remove { eventList.Remove(value); }
   }

    private void RaiseEvent1()
    {
        foreach(var e in eventList)
        {
            e(this, EventArgs.Empty);
        }
    }

SortedList特定の順序が必要な場合は、を使用してください...

于 2012-08-20T18:51:31.520 に答える
0

これは、複数のイベントが必要な場所のようです。

順序が重要な場合は、2つのイベントがあり、1つは単純に次々に発生します。これは、たとえば、ASPのページライフサイクルで確認できます。多くのイベントがあり、場合によっては、前のイベントのすべてのハンドラーが実行されることを保証する以外に、それらの間に実際に何かが発生して、すべてが次々に発生します。それはここでのあなたの場合と同じように聞こえます。

于 2012-08-20T19:10:49.013 に答える