【问题标题】:C# WPF Multithreading with real-time PLCC# WPF 多线程与实时 PLC
【发布时间】: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


【解决方案1】:

我已经解决了这个问题!我恢复到标准定时器并且能够绕过不需要 STA 模式;这需要 Dispatcher.Invoke 的另一个司法安置。

现在一切正常。

【讨论】:

  • 当心阻塞 Dispatcher.Invoke 方法。您可以轻松地让自己陷入僵局。您还可以得到一个 非常 深的调用堆栈。 BeginInvoke 往往更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
相关资源
最近更新 更多