DispatcherTimer和显示模态窗口

本文关键字:窗口 模态 显示 DispatcherTimer | 更新日期: 2023-09-27 18:04:41

让我们看看是否有人可以解释我这种行为,也许我该如何解决这个问题。我有一个WPF应用程序,并在我的ViewModel我有一个DispatcherTimer。在ViewModel中,我有一个命令来显示模态窗口,如下所示:

private void ShowWindowCommandExecuted()
{
     wnNewWindow window = new wnNewWindow();
     window.ShowDialog();
}

当我调用这个命令从一个按钮,新的窗口显示和DispatcherTimer保持在后台运行。到目前为止一切顺利。问题是当我试图从DispatcherTimer显示窗口时,像这样:

DispatcherTimer timerInstrucciones;
timerInstrucciones = new DispatcherTimer();
timerInstrucciones.Interval = TimeSpan.FromMilliseconds(1000);
timerInstrucciones.Tick += (s, e) =>
{
     wnNewWindow window = new wnNewWindow();
     window.ShowDialog();     
};
timerInstrucciones.Start();

在这种情况下,新窗口也会显示,但只要它是可见的,DispatcherTimer就会停止"滴答"。我理解DispatcherTimer在UI线程中运行,但为什么它在这种情况下以不同的方式表现?

DispatcherTimer和显示模态窗口

一般来说,ShowDialog是一个模态对话框,它将阻塞调用线程,并显示对话框。它还会阻止与父/所属窗口的交互。

只要你关闭模态对话框,ui线程就会被阻塞。因为它是DispatcherTimer,所以它属于Window的Dispatcher并在同一个线程中运行。因此,如果这个线程被阻塞,DispatcherTimer将停止运行。

根据您的评论更新:

我没有通过这方面的任何文档,但基本的区别是DispatcherTimer将运行Synchronously,而不是以Asynchronous的方式。

不会阻塞Dispatcher:

 timerInstrucciones.Tick += (s, e) =>
        {
            this.Dispatcher.BeginInvoke(new Action(() =>
           {
               wnNewWindow mn = new wnNewWindow();
               mn.ShowDialog();
           }));
        };

将阻塞Dispatcher:

timerInstrucciones.Tick += (s, e) =>
        {
            this.Dispatcher.Invoke(new Action(() =>
           {
               wnNewWindow mn = new wnNewWindow();
               mn.ShowDialog();
           }));
        };

由于Dispatcher每n秒将Invoke替换Event,如果线程在调用Event内的任何操作被阻塞,Event就不能再被调用了。