是否有任何可以使用的解决方案来分组活动?
说我有两个事件:A和B.
我希望在A和B被触发时执行方法M,它们不需要同时触发.
就像是:
小组赛事G同时发射,A和B都被解雇.我只需要在Group事件G中注册Method M.
A可以发射不止一次,G只会在B发射后开火.相同的方式.
我正在寻找一个有这些活动的图书馆.
编辑:示例
Events: A | B | G 1 F 0 0 2 0 F F 3 0 F 0 4 0 F 0 5 0 F 0 6 F 0 F 7 F 0 0 8 0 F F 9 0 0 0 10 F F F
F表示事件触发,
0它没有.
解决方法
你可以使用
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,...)
触发两个事件时会触发生成的observable.
编辑
CombineLatest会生成具有最新结果的输出,而不会重置其状态.因此,例如,如果A1被点燃,则B1被点燃G1被产生(A1 B1),但是如果点燃B2则产生G2(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扩展,但我找不到它.