让我们看看是否有人能解释我的这种行为,也许我能解决这个问题。我有一个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线程中运行,但是为什么在这种情况下它以不同的方式运行呢?
发布于 2016-08-29 08:38:51
通常,ShowDialog是一个模式对话框,它将阻塞调用线程,并显示该对话框。它还将阻止与父/拥有窗口的交互。
只要关闭Modal对话框,UI线程就会被阻塞。因为它是一个DispatcherTimer,所以它属于窗口的Dispatcher,并且运行在同一个线程中。因此,如果该线程被阻塞,则DispatcherTimer将停止运行。
基于您的评论的更新:
关于这一点,我还没有看过任何文档,但是基本的区别是DispatcherTimer将运行Synchronously,而不是以Asynchronous的方式运行。
不会阻塞调度程序:
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秒钟调用一次Event,因此如果线程在调用Event中的任何操作被阻塞,则不能再调用Event。
https://stackoverflow.com/questions/39201468
复制相似问题