基于实时PLC的C#WPF多线程处理

基于实时PLC的C#WPF多线程处理,c#,wpf,multithreading,mvvm,C#,Wpf,Multithreading,Mvvm,我有一个应用程序,监控来自外部套接字/以太网连接的位状态,称为PLC设备 这些状态触发数据库调用和UI更新,其中一些需要模态对话框,另一些需要非模态对话框 问题是,即使在显示模式对话框时,流程也需要持续监控 我曾尝试使用Dispatcher,但当显示模式对话框时,这将阻止。我明白原因 我尝试了一个标准计时器,但我得到了一个异常,比如“一些UI组件要求线程在STA模式下运行。” 因此,我创建了一个标准线程,并将ApartmetState设置为STA。在处理循环中需要UI交互的部分添加Dispatc

我有一个应用程序,监控来自外部套接字/以太网连接的位状态,称为PLC设备

这些状态触发数据库调用和UI更新,其中一些需要模态对话框,另一些需要非模态对话框

问题是,即使在显示模式对话框时,流程也需要持续监控

我曾尝试使用Dispatcher,但当显示模式对话框时,这将阻止。我明白原因

我尝试了一个标准计时器,但我得到了一个异常,比如“一些UI组件要求线程在STA模式下运行。”

因此,我创建了一个标准线程,并将ApartmetState设置为STA。在处理循环中需要UI交互的部分添加DispatcherInvoke后,线程运行正常,但每当显示模式对话框时,线程都会被阻塞,直到模式对话框关闭

现在我真的不想进入线程间消息传递,让整个事情变得过于复杂

我还尝试在需要模态对话框时将模态对话框放入自己的线程中。一切正常,几乎可以接受,但应用程序的所有者窗口仍然可以访问,基本上使模式对话框成为无模式对话框。我试着在owner窗口上设置IsEnabled标志,起初我认为这样可以,但当单击时它仍然处于活动状态,并隐藏对话框


有什么建议吗?

我已经解决了这个问题!我又回到了一个标准的计时器,能够在不需要STA模式的情况下四处走动;这需要Dispatcher.Invoke的另一个司法位置


现在一切正常。

将您的评论纳入问题帖子。因此,像ConcurrentQueue这样最简单的线程间消息传递还不够吗?调度程序计时器不应受到模式对话框的影响。调用
ShowDialog
时,将保留调用堆栈,但会执行嵌套的调度程序循环,直到
ShowDialog
返回。这就是为什么您可以继续处理布局和输入事件等。计时器应该包含在其他东西中,除非明确为它们划分了例外,这会让我感到惊讶。但是,如果在计时器回调中显示模式对话框,则会阻止它启动,因为回调不可重入。我通常在windows中使用MahApps metro,它有一个非常好的窗口内对话框实现。请注意阻塞
调度程序。调用
方法。你可以很容易地让自己陷入僵局。您还可以得到一个非常深的调用堆栈
BeginInvoke
往往更安全。