好的编码? (多个消息循环)

时间:2012-07-25 06:12:35

标签: c# multithreading coding-style

我需要一些正确编码的建议:

我正在开发一个使用多个串行连接的程序。每条通信线路都有一个控制器作为抽象层。在控制器和串行端口之间,插入协议以将数据包装在包中,准备传输。该协议负责发送失败,重发等。 为确保GUI不会挂起,每个连接线(协议和串行端口)都在单独的线程上创建。控制器由主线程处理,因为它在GUI中有控件。

目前,当我创建线程时,我选择在它们上创建一个消息循环(Application.Run()),所以改为轮询缓冲区并且如果没有工作则让步,我只是调用线程(BeginInvoke)并使用消息循环作为缓冲区。目前这种方法效果很好,到目前为止还没有出现严重问题。

我现在的问题是:这是“良好的编码”,还是我应该使用while循环而不是轮询缓冲区?或者第三件事?

我想展示代码,但到目前为止它是几千行代码,所以如果您需要查看代码的任何部分,请具体说明。 :)

谢谢。

2 个答案:

答案 0 :(得分:4)

在每个线程中使用消息循环是完全正常的; Windows针对此方案进行了优化。您是正确的,以避免轮询,但您可能想要查看其他更高效的基于事件的设计,例如准备传输包并调用SetEvent以通知其已准备好的线程,或信号量和线程 - 马丁詹姆斯建议的安全队列。

答案 1 :(得分:1)

我不是百分之百确定你在这里做什么,但是,有点“填写”它听起来并不坏:)

当您的应用空闲时(无通信),CPU使用0%?

你的应用程序是否没有睡眠(0)/睡眠(1)或类似的轮询循环?

它是否以合理的低延迟运行?

如果答案是三个'是',你应该没事:)

有一些(非常少的!)情况,其中轮询结果等是一个好主意,(例如,当线程中的事件频率如此之高以至于向GUI发出每个进度事件的信号将会不堪重负它),但大多数情况下,这只是糟糕的设计。