需要关于VB.Net多线程选项的建议吗

需要关于VB.Net多线程选项的建议吗,vb.net,multithreading,controls,richtextbox,Vb.net,Multithreading,Controls,Richtextbox,大家好 我花了很长时间才弄明白在我当前的工作项目中应该使用哪种多线程方法。因为我一生中从未编写过多线程应用程序,所以这一切都令人困惑,而且非常难以理解。不用多说,以下是我的背景故事: 我被指派在我公司的研发实验室接管一台测试设备的控制应用程序。该程序必须能够半同时发送和接收三个不同设备的串行通信。最初的程序是用VB6编写的(没有多线程),我确实计划对其进行修改,以便与需要测试的较新产品一起使用,直到在测试期间由于过度串行通信而导致UI锁定时,它会造成安全隐患。这导致部分测试仪硬件崩溃,因此我决定

大家好

我花了很长时间才弄明白在我当前的工作项目中应该使用哪种多线程方法。因为我一生中从未编写过多线程应用程序,所以这一切都令人困惑,而且非常难以理解。不用多说,以下是我的背景故事:

我被指派在我公司的研发实验室接管一台测试设备的控制应用程序。该程序必须能够半同时发送和接收三个不同设备的串行通信。最初的程序是用VB6编写的(没有多线程),我确实计划对其进行修改,以便与需要测试的较新产品一起使用,直到在测试期间由于过度串行通信而导致UI锁定时,它会造成安全隐患。这导致部分测试仪硬件崩溃,因此我决定尝试在VB.Net中重写该应用程序,因为从一开始我对它比较熟悉,因为我认为多线程可能有助于解决这个问题

我的计划是从主应用程序线程向其他设备发送命令,并将接收端旋转到它们自己的线程中,以便在计时非常关键时主线程不会锁定。然而,我还没有接受我的选择。为了增加我的问题,我需要在接收到来自一个特定设备的数据时,在单独的富文本框中显示接收到的通信,而主程序需要解析数据,但只显示来自最新测试的文本(我需要文本框包含所有接收到的数据)

到目前为止,我已经调查了代理,自己处理线程,并且刚刚开始调查后台工作人员。今天早些时候,我尝试使用委托,但找不到更新文本框的方法。我是否需要使用回调函数来执行此操作,因为我不能在委托函数本身的主体中执行此操作?我自己处理线程时遇到的问题是如何在线程和程序其余部分之间来回传递数据。正如我所说,我刚刚开始调查背景员工,所以我还不确定该怎么看待他们

我还应该注意到,计划是让生成的线程持续运行,直到以某种方式触发停止。上述任何一个选项都可能实现这一点吗?还有其他选择我还没有发现吗


对不起,我的篇幅很长,而且我似乎在漫无目的地散布一些杂乱无章的信息,但我的最后期限很紧,压力很大,以至于我无法正确思考!任何建议/信息/链接都将不胜感激。我只需要帮助权衡各种选择,这样我就可以选择一个方向并继续前进。感谢所有花时间阅读这篇文章的人

好的,串行端口、线程间通信、GUI组件(如RichTextBox)中的显示内容需要快速解析传入数据,以解码协议并发送到状态机

三个串行端口是否都将进入同一个“processControl”状态机

如果是这样,那么您可能应该通过组装事件/数据对象并将它们排队到由一个线程运行的状态机来实现这一点(请参阅BlockingCollection)。这比用互斥锁锁定状态引擎更安全、更容易理解/调试

定义一个“comms”类来保存数据并在系统中传输。它应该有一个“command”枚举,这样得到它的线程就可以通过打开枚举来做正确的事情。“事件”成员,可设置为状态引擎使用的任何内容。一种“bool loadChar(char inChar)”,可以将逐字符的数据抛入其中,并且只有当一个完整的、经过验证的协议单元已组装、检查并解析为数据管理器时,才会返回“true”。“string textify()”方法,用于以文本形式转储有关所包含数据的信息。用于保存文本内容的常规“状态”字符串。“errorMess”字符串和异常成员

您可能会想到,这个comms类可以在系统中传输任何东西。它被封装,因此线程可以使用它的数据和方法,而无需引用任何其他通信实例——它不需要任何锁定。它可以排队处理阻塞集合上的线程,并开始调用GUI线程来显示内容

在serialPort对象中,在启动时创建一个COMM,并用serialPort实例加载一个成员。并且,当DataReceived事件激发时,从args每次获取一个char并激发到comms.loadChar()中。如果loadChar调用返回true,请将comms实例排队到状态机输入BlockingCollection,然后立即创建另一个COMM,并开始加载新的COMM和数据。只要一直这样做——用char加载comms实例,直到它们拥有一个经过验证的协议单元,并将它们排入状态机队列。可能每个串行端口都有自己的协议-OK,因此您可能需要三个覆盖loadChar的COMM子体来正确解码自己的协议

在状态机线程中,只需从输入中获取()comms对象,并使用comms对象中的当前状态和事件执行状态引擎操作。如果SM操作例程决定显示某些内容,则开始将命令设置为“displaySomeStuff”并将其发送到GUI线程。当GUI线程获得命令时,它可以打开命令来决定显示什么/什么

无论如何,这就是我构建所有进程控制类型应用程序的方式。数据在“comms”对象实例中围绕系统流动,没有任何comms对象一次被多个THAD操作。这一切都是通过在BlockingCollection(或类似)、队列或BeginInvoke()上传递消息来完成的(如果转到GUI线程)

唯一的锁在队列中,因此被封装。根本没有显式锁。这意味着根本不可能存在显式死锁。b,我确实头疼