You can use Reactive Extensions .
Take a look at the Observable.FromEvent (or Observable.FromEventPattern) method to convert a standard .NET event to an observable, and then you can group the results using Observable.CombineLatest .
Here is the pseudo code:
var observableA = Observable.FromEvent(yourEventA); var observableB = Observable.FromEvent(yourEventB); var observableG = observableA.CombineLatest(observableB, ...)
The generated observable is triggered when both events are triggered.
EDIT
CombineLatest displays the result with the latest results without resetting its state. So, for example, if A1 is started, then B1 is started. G1 is produced from (A1 + B1), but if B2 is fired, G2 is made from (A1 + B2) and so on ...
To accurately represent the expected results, you can write something like:
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"); //}
Basically I check if the latest results are different from the current result. Perhaps for your case there is a native RX extension, but I can not find it.
source share