我有持续的数据包流。每次传入新包(间隔为100毫秒)时,都会弹出一个事件,我将包发送到一个类来处理数据并将其可视化。不幸的是,如果在处理当前包之前发送了新包,则可能会中止包的过程。
是用作另一个程序的dll的代码。 当我开始编写dll时,我是c#的新手,所以我不想太复杂。一切正常,但如果cpu非常忙,我会遇到一些丑陋的Frame跳过(在我的可视化部分)。
我有几个类,其中一个是处理所有包。这个类有50个属性,25个函数和1000行代码。计算只需要6个函数。 其余的是正确设置属性(如果用户更改设置)。
所以现在我想使用List缓冲所有传入的数据。 该列表应由另一个线程处理。因此,将数据写入列表的时间不可能超过100毫秒^^(2个数组,每个数据大约40个,应该等于什么都没有)
将提到的类拆分为2个单独的类。 一个处理包,另一个处理设置。所以我会拆分用户和“程序”输入。 创建一个使用“包处理”类来处理缓冲数据的线程。
由于设置类包含处理类所需的重要属性,因此我不知道如何做到最好,因为处理类还需要更改/填充设置类中的缓冲区。但是这个将由主线程调用。或者最好不拆分设置和处理类并保持原样?我不熟悉线程并阅读这本免费电子书的第一章Threading in C#
答案 0 :(得分:2)
我只是添加一个队列并实现一个线程进行处理。这将有助于您跳过并且几乎不需要更改。通过拆分设置来重构代码似乎是很多工作,几乎没有什么好处和可能的新错误。
添加队列;
创建一个ConcurrentQueue(这是线程安全的lifo,这是你需要的)
var cq=new ConcurrentQueue<Packets>();
将所有数据包添加到该队列
cq.Enqueue(newPacket);
创建另一个循环并处理队列的线程
if (cq.TryDequeue(out newPacket))
{
// Visualize new packet
}