Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Win Forms应用程序中处理多个线程的最佳方法_C#_Winforms_Multithreading - Fatal编程技术网

C# 在Win Forms应用程序中处理多个线程的最佳方法

C# 在Win Forms应用程序中处理多个线程的最佳方法,c#,winforms,multithreading,C#,Winforms,Multithreading,我们有一个应用程序,多个子系统在不同线程中运行(即一个线程监视GPS,另一个线程监视RFID阅读器等)。线程由服务注册表启动和监控,该注册表与win forms部分分离 该应用程序的初始版本只有一个表单,可以在更新计时器上运行,每隔一秒钟左右检查每个子系统上的静态变量值 我正在尝试清理这个问题,因为我们正在添加额外的表单,而当前的方法实际上没有线程安全性。我希望每个子系统在其底层状态发生变化时抛出一个新事件,这样每个表单只能订阅它关心的事件,我们可以移动到响应性更强的UI…我不喜欢更新计时器方法

我们有一个应用程序,多个子系统在不同线程中运行(即一个线程监视GPS,另一个线程监视RFID阅读器等)。线程由服务注册表启动和监控,该注册表与win forms部分分离

该应用程序的初始版本只有一个表单,可以在更新计时器上运行,每隔一秒钟左右检查每个子系统上的静态变量值

我正在尝试清理这个问题,因为我们正在添加额外的表单,而当前的方法实际上没有线程安全性。我希望每个子系统在其底层状态发生变化时抛出一个新事件,这样每个表单只能订阅它关心的事件,我们可以移动到响应性更强的UI…我不喜欢更新计时器方法

我在这里遇到了问题,因为事件是在子系统线程中触发的,所以当我尝试用事件传递的任何状态更新UI时,System.InvalidOperationException异常会抱怨跨线程调用

因此,目前,在阅读了msdn文档之后,我的选择是对我希望更新的每个字段使用control.invoke,这在具有大量字段的复杂表单上非常烦人,使用后台工作人员在表单中运行子系统,或者让表单仍然在计时器上运行,并查询子系统本身,这是我试图避免的。我希望表单尽可能独立于底层系统……它们应该只知道它们关心哪些事件,并更新相关字段

我的问题是,我在这里遗漏了什么??有没有更好的方法来构建这个系统,这样子系统可以在自己的线程中运行,但仍然以非耦合的方式发送通知

任何帮助都将不胜感激

干杯


nimai

使用委托并调用一个方法,一次完成所有更新,而不是为每个要更新的字段调用。例如

BeginInvoke( new MethodInvoker( MyUIUpdaterMethodHere ) );

不要对每个要更新的字段都调用,而是使用一个委托,并调用一个同时执行所有更新的方法。例如

BeginInvoke( new MethodInvoker( MyUIUpdaterMethodHere ) );
您可以看看基本上允许基于事件的松散耦合发布/子类型体系结构的模式。Prism是Microsoft Patterns and Practices团队的一个框架,用于使用WPF和Silverlight构建复合应用程序,它具有事件聚合功能,允许不同的UI组件以类似于您的设计目标的松散耦合方式相互通信。您可以查看它,并尝试仅使用它的事件聚合部分。如果没有,您可以访问源代码,这样您就可以设计出符合您需求的东西。

您可以看看基本上允许松散耦合的基于发布/子类型事件的体系结构的模式。Prism是Microsoft Patterns and Practices团队的一个框架,用于使用WPF和Silverlight构建复合应用程序,它具有事件聚合功能,允许不同的UI组件以类似于您的设计目标的松散耦合方式相互通信。您可以查看它,并尝试仅使用它的事件聚合部分。如果没有,您可以访问源代码,这样您就可以设计出符合您需求的东西。

您可以使用它传入SendOrPostCallBackDelegate(或lambda),它反过来可以以线程安全的方式更新多个控件

听起来这些子系统是作为windows服务运行的。 winform应用程序如何与这些子系统通信。

您可以使用它传入SendOrPostCallBackDelegate(或lambda),它反过来可以以线程安全的方式更新多个控件

听起来这些子系统是作为windows服务运行的。 winform应用程序如何与这些子系统通信