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