让我们看看是否有人能解释我这种行为,也许我该如何解决这个问题。我有一个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
,但在这种情况下它为什么会以不同的方式运行?
答案 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}}。