c#如何重构我的程序以进行线程化

问题

我有一个不断的数据包流.每次传入新包(间隔为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
     }
点赞