Reactive Extensionsを使用できます。
Observable.FromEvent(またはObservable.FromEventPattern)メソッドを参照して、標準.NETイベントをobservableに変換してから、Observable.CombineLatestを使用して結果をグループ化できます。ここ
は擬似コードである:
var observableA = Observable.FromEvent(yourEventA);
var observableB = Observable.FromEvent(yourEventB);
var observableG = observableA.CombineLatest(observableB, ...)
両方のイベントがトリガされたときに発生する観察がトリガされます。
EDIT
CombineLatest
は、その状態をリセットすることなく、最新の結果と出力を生成します。例えばA1が発射され、B1が発射された場合、G1は(A1 + B1)で生成されますが、B2が発射されると(A1 + B2)などで生成されます...
正確に期待される結果は次のように書くことができます:
private void SetupEvents()
{
var observableA = Observable.FromEventPattern((e) => btA.Click += e, (e) => btA.Click -= e);
var observableB = Observable.FromEventPattern((e) => btB.Click += e, (e) => btB.Click -= e);
EventPattern<object> lastA = null;
EventPattern<object> lastB = null;
var observableG = observableA.CombineLatest(observableB, (rA, rB) =>
{
if (lastA == rA || lastB == rB)
return null;
lastA = rA;
lastB = rB;
return new Tuple<EventPattern<object>, EventPattern<object>>(rA, rB);
}).Where(p => p != null);
observableG.Subscribe(r => Trace.WriteLine("A + B"));
// or use ToEvent to generate another standard .NET event
//observableG.ToEvent().OnNext += GEvent;
}
//void GEvent(System.Reactive.EventPattern<object> obj)
//{
// Trace.WriteLine("A + B");
//}
最新の結果が現在の結果と異なるかどうかを確認します。 あなたのケースにネイティブRX拡張機能があるかもしれませんが、見つけられません。
a、a、a、b、bが発砲した場合、この場合何回gを発射すべきですか? – vittore
または、あなたのコードでAとBが特定のインスタンスに対して1回だけ起動することを保証していますか?もっと詳細が本当に助けになるでしょう。 – Renan