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