2016-05-03 31 views
0

TL; DR:すべてのイベントが発生することがわかっていても、多くのイベントに関連付けられたハンドラを1回だけ起動できますか?複数のイベント、1つのハンドラが1回だけ呼び出される

私は特定のタスクを完了し、それが完了したことを所有者に通知するオブジェクトのコレクションを聴きようとしています。これを行うために、単にコレクションをループし、各オブジェクトにイベントハンドラを追加しました。

foreach(var obj in collection) 
{ 
    obj.Event += GroupHandler; 
} 

これは問題なく動作します。しかし、私はタスクが同じ時間に完了することを知っているので、少し早く待ち行列に入れるかどうかは関係ありませんから、GroupHandlerを一度上げれば、もう一度上げることはできません私はのような何かを行うことができます設定し、現在の実行のために:

private void GroupHandler(object sender, EventArgs e) 
{ 
    foreach(var obj in collection) 
    { 
    obj.QueueNext(); 
    } 
} 

理想的には私が

private void GroupHandler(object sender, EventArgs e) 
{ 
    if(GroupHandler.HasRun) return; 

    foreach(var obj in collection) 
    { 
    obj.QueueNext(); 
    } 
} 

のようなもので終わるだろうと私はいくつかのグローバルブール値(またはそれ以上の可能性がint型を使用することができることを知っていますサイクルを追跡するために)、私はそれを解決策としては嫌いです。私はそれより少し素敵なものを探しています。

+1

最初の呼び出しでオブジェクトからイベントを切り離します。 – Gusman

+0

しかし、私はそれらを後でもう一度持ち上げてほしいです。おそらく道路の15-20秒後 –

+0

それらを再接続しますが、私はあなたが問題の見落としをしていると信じています。 – Gusman

答えて

0

私はGusmanがこのコメントで言及したものを使ってイベントハンドラを削除しました。実際のキーは、どこにそれらを再接続するかを知っていました。そこで、私はQueueNext呼び出しでハンドラ関数を渡してしまいました。

コードは、この

private void GroupHandler(object sender, EventArgs e) 
{ 
    foreach(var obj in collection) 
    { 
    obj.Event -= GroupHandler; 
    } 

    foreach(var obj in collection) 
    { 
    obj.QueueNext(GroupHandler); 
    } 
} 

のように見えるとQueueNextは、この方法イベントは一度しか呼ばれ、実行の各セットのために呼び出されます

public void QueueNext(EventHandler nextHandler) 
{ 
    this.Event += nextHandler 
    QueueNext(); 
} 

のように見えます。

0

Gusmanがコメントで述べたように、オブジェクトの1つだけでイベントを起動できます。そうすれば、イベントセットごとに1回だけ実行されます。

また、タイマー、カウンタ、フラグを設定することもできます。最初のイベント実行時にフラグを設定し、タイマーを開始します。フラグが設定されている限り、残りのイベントは無視してください。カウンターをトラッキングしているオブジェクトの数に設定し、カウンタがイベントを発生させるごとにカウンターを減らします。タイマが満了するか、またはカウンタがゼロになると、フラグをリセットし、カウンタをリセットし、タイマをキャンセルします。これは急速に複雑になる可能性があり、コーナーケースがたくさんある可能性があります。タイミングについてあまり気にしなければ、最初の方法がはるかに優れています。可能な限り簡素化する。

+0

あなたはそれが複雑になるのは間違いではない、私はそれに似た何かを試みた、そしてそれはすぐに醜くなった。オブジェクトの1つしか持っていないため、イベントを起こしているのですが、現在どのように動き回っているのですか?もっと良い方法が必要です。たった一つの発射での問題は、取り付けられたオブジェクトが常に実行されているという前提を強制することです。これは実装するのが難しくありませんが、まさに私が行っている設計ではありません。 –

+0

"イベントセット"の境界を定義するものは何ですか?これは、利用可能なソリューションの種類を指示します。各オブジェクトが少なくとも1回は起動していれば、カウンタが最もうまくいくかもしれません。タイムバインドの場合は、タイマーをつけてください。ここにはたくさんのオプションがあります。最も単純で最も簡単に維持される方法を選択してください。 –

関連する問題