簡體   English   中英

只要沒有觸發其他事件,就等待事件

[英]Wait for event so long as other event hasn't fired

我有一個異步方法,在此之前,我希望在執行控件的OnLeave事件后2秒之前阻止執行,但OnLeave是同時未觸發OnEnter事件。

換句話說,如果觸發了OnLeave事件,然后在1秒鍾后觸發了OnEnter ,則它應等待另一個OnLeave + 2秒,而不會再次觸發OnEnter ,然后再返回我的方法。

這也應該實現一個超時,並且我研究了如何使用帶有超時的Task.WaitAll(),但是由於這兩個事件的依賴性,我不太確定如何執行第一部分。

誰能提供一些建議?

嘗試這個:

public class Control {
    public EventHandler OnEnter;
    public EventHandler OnLeave;

    public void TriggerEnter() {
        if (OnEnter != null) {
            OnEnter(null, EventArgs.Empty);
        }
    }

    public void TriggerLeave() {
        if (OnLeave != null) {
            OnLeave(null, EventArgs.Empty);
        }
    }
}

class Program {
    public static EventHandler OnBufferedEvent;

    static void Main(string[] args) {
        bool hasEntered = false;
        Timer timer = new Timer(2000);
        OnBufferedEvent += (sender, eventArgs) => Console.WriteLine("My buffered event has fired");

        timer.Elapsed += (sender, e) =>{
            if (!hasEntered) {
                if (OnBufferedEvent != null) {
                    OnBufferedEvent(null, EventArgs.Empty);
                }
            }
        };

        Control control = new Control {
            OnEnter = (sender, eventArgs) => {
                hasEntered = true;
                Console.WriteLine("On enter event has fired");
            },
            OnLeave = (sender, eventArgs) => {
                hasEntered = false;
                timer.Start();
                Console.WriteLine("On leave event has fired");
            }
        };

        control.TriggerLeave();
        Thread.Sleep(1000);
        control.TriggerEnter();
        Thread.Sleep(100);
        control.TriggerLeave();
        Thread.Sleep(2500);
    }
}

另一個更奇特的解決方案是使用Rx緩沖事件並對其進行觀察邏輯。

鏈接提供了更多解釋,但是您將必須從Enter和Leave事件中創建可觀察的集合,並將它們混合在一起。 這不是一件微不足道的任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM