我的应用程序中有一个用于显示消息的弹出窗口。 有时,两条消息相互之后显示得太快,第二条消息会覆盖第一条消息,使其消失得太快。
所以我想要的是下一条消息等待上一条消息关闭。
我正在使用DispatcherTimer
和MouseEvent来关闭弹出窗口:
popupTimer.Interval = TimeSpan.FromSeconds(5d);
popupTimer.Tick += (sender, args) =>
{
popupMessage.IsOpen = false;
popupTimer.Stop();
};
popupMessage.MouseDown += (sender, args) =>
{
popupMessage.IsOpen = false;
popupTimer.Stop();
};
显示消息的方式如下:
popupMessage.Dispatcher.Invoke(
() =>
{
popupMessage.IsOpen = true;
popupTimer.Start();
});
现在,如果我将以下循环放在show delegate
中 while(popupMessage.IsOpen) {}
即使在等待5秒钟以后计时器耗尽,应用程序也会挂起,而IsOpen永远不会变回False。除此之外,我不喜欢像这样使用阻塞的while循环。
有没有办法让我的消息互相等待?我尝试使用一个简单的bool而不是PopupMessage的IsOpen,但无济于事。
答案 0 :(得分:1)
快速入侵:
while(popupMessage.IsOpen)
{
System.Threading.Thread.Sleep(0);
}
最好的事情可能是从队列中提取消息
Queue<...> messages = new Queue<...>();
...
popupTimer.Tick += (sender, args) =>
{
if (messages.Count > 0)
{
... = messages.Dequeue();
}
else
{
popupMessage.IsOpen = false;
popupTimer.Stop();
}
};
并在邮件打开时对其进行排队。
if (popupMessage.IsOpen) {
messages.Enqueue(...);
}