首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DispatcherTimer和Show窗口

DispatcherTimer和Show窗口
EN

Stack Overflow用户
提问于 2016-08-29 08:12:44
回答 1查看 907关注 0票数 1

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

代码语言:javascript
复制
private void ShowWindowCommandExecuted()
{
     wnNewWindow window = new wnNewWindow();
     window.ShowDialog();
}

当我从一个按钮调用这个命令时,会显示新的窗口,并且DispatcherTimer继续在后台运行。到目前一切尚好。问题是当我试图像这样显示来自DispatcherTimer的窗口时:

代码语言:javascript
复制
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线程中运行,但是为什么在这种情况下它以不同的方式运行呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-29 08:38:51

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

只要关闭Modal对话框,UI线程就会被阻塞。因为它是一个DispatcherTimer,所以它属于窗口的Dispatcher,并且运行在同一个线程中。因此,如果该线程被阻塞,则DispatcherTimer将停止运行。

基于您的评论的更新:

关于这一点,我还没有看过任何文档,但是基本的区别是DispatcherTimer将运行Synchronously,而不是以Asynchronous的方式运行。

不会阻塞调度程序:

代码语言:javascript
复制
 timerInstrucciones.Tick += (s, e) =>
        {
            this.Dispatcher.BeginInvoke(new Action(() =>
           {
               wnNewWindow mn = new wnNewWindow();
               mn.ShowDialog();
           }));
        };

将阻塞Dispatcher:

代码语言:javascript
复制
timerInstrucciones.Tick += (s, e) =>
        {
            this.Dispatcher.Invoke(new Action(() =>
           {
               wnNewWindow mn = new wnNewWindow();
               mn.ShowDialog();
           }));
        };

因为,Dispatcher将每n秒钟调用一次Event,因此如果线程在调用Event中的任何操作被阻塞,则不能再调用Event

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39201468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档