gpt4 book ai didi

c# - C#中的分组事件

转载 作者:太空狗 更新时间:2023-10-29 21:09:28 27 4
gpt4 key购买 nike

是否有现成的分组事件解决方案?

假设我有两个事件:A 和 B。我希望在 A 和 B 被触发时执行方法 M,它们不需要完全同时触发。

类似于:组事件 G 在 A 和 B 都触发后触发。我只需要在团体事件 G 上注册方法 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.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 扩展,但我找不到它。

关于c# - C#中的分组事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16680678/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com