【发布时间】:2017-09-14 21:46:16
【问题描述】:
我有一个应用程序可以监控来自外部套接字/以太网连接的位状态,称为 PLC 设备。
这些状态会触发数据库调用和 UI 更新,其中一些需要模态对话框,另一些需要无模态对话框。
问题是即使显示模态对话框,进程也需要持续监控。
我曾尝试使用 DispatcherTimer,但是当显示模态对话框时它会阻塞。我明白原因。
我尝试了一个标准计时器,但我收到一个异常,说明“某些 UI 组件需要线程以 STA 模式运行。”
所以我创建了一个标准线程并将ApartmetState 设置为STA。在需要 UI 交互的处理循环部分周围添加 DispatcherInvoke 后,线程运行良好,但每当显示 Modal 对话框时,线程就会被阻塞,直到 Modal 对话框关闭。
现在我真的不想进入线程间消息传递和过度复杂化整个事情。
每当需要模态对话框时,我也尝试将模态对话框放入自己的线程中。一切正常,几乎可以接受,但应用程序的所有者窗口仍然可以访问,基本上使模态对话框成为无模式对话框。我尝试在所有者窗口上设置 IsEnabled 标志,起初我认为这没问题,但单击并隐藏对话框时它仍然处于活动状态。
有什么建议吗?
【问题讨论】:
-
将您的评论合并到问题帖子中。
-
那么,像 ConcurrentQueue
这样最简单的线程间消息传递,还不够吗? -
调度程序计时器不应受到模态对话框的影响。当您调用
ShowDialog时,您的调用堆栈会被保留,但会执行一个嵌套的调度程序循环,直到ShowDialog返回。这就是为什么您可以继续处理布局和输入事件等。计时器应该包含在其他东西中,除非明确为它们划出一个例外,这让我感到惊讶。但是,如果您在计时器回调中显示模态对话框,则会阻止它触发,因为回调不可重入。 -
我通常在我的窗口中使用 MahApps Metro,它有一个非常好的窗口内对话框实现。
标签: c# wpf multithreading mvvm