[英]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.