DispatcherTimer和Show Modal Window

时间:2016-08-29 08:12:44

标签: c# wpf

让我们看看是否有人能解释我这种行为,也许我该如何解决这个问题。我有一个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就会停止"勾选"。我理解在UI线程中运行DispatcherTimer,但在这种情况下它为什么会以不同的方式运行?

1 个答案:

答案 0 :(得分:2)

通常,ShowDialog是一个模态对话框,它将阻止调用线程,并显示对话框。它也会阻止与父/拥有窗口的交互。

只要关闭模态对话框,就会阻止UI-Thread。因为它是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不再被调用1}}。