微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在C#中分组事件

是否有任何可以使用的解决方案来分组活动?

我有两个事件: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扩展,但我找不到它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐