4

问题

我有源源不断的数据包。每次有新包传入(100 毫秒间隔)时,都会弹出一个事件,在该事件中我将包发送到一个类以处理数据并将其可视化。不幸的是,如果在处理当前包之前发送了一个新包,则可能会中止包的处理。

我现在拥有的

是用作另一个程序的 dll 的代码。当我开始编写 dll 代码时,我是 c# 的新手,所以我不想把它写得太复杂。一切正常,但如果 cpu 很忙,我会遇到一些丑陋的跳帧(在我的可视化部分)。

我有几个类,其中之一是处理所有包。这个类有大约 50 个属性、25 个函数和 1000 行代码。计算只需要 6 个函数。剩下的就是正确设置属性(如果用户更改设置)。

我需要改变什么

所以现在我想通过使用列表来缓冲所有传入的数据。该列表应由另一个线程处理。因此,将数据写入列表的时间不太可能超过 100 毫秒 ^^(2 个数组,每个数组有 40 个元素,每个元素应该等于无)

我的想法

将提到的类拆分为 2 个单独的类。一个处理包,一个处理设置。所以我会拆分用户和“程序”输入。创建一个使用“包处理”类来处理缓冲数据的线程。

我不知道什么

由于设置类包含处理类所需的重要属性,我不知道如何做到最好,因为处理类还需要更改/填充设置类中的缓冲区。但这将由主线程调用。或者最好不要拆分设置和处理类并保持原样?我对线程不是很熟悉,阅读了这本免费电子书Threading in C#的第一章

4

1 回答 1

2

我只想添加一个队列并实现一个线程进行处理。这将帮助你跳过并且几乎不需要改变。通过拆分设置来重构代码似乎需要做很多工作,但几乎没有什么好处,而且还可能出现新的错误。

添加队列;

  • 创建一个 ConcurrentQueue(这是线程安全的 lifo,这正是您所需要的)

        var cq=new ConcurrentQueue<Packets>();
    
  • 将所有数据包添加到该队列

         cq.Enqueue(newPacket);
    
  • 创建另一个循环并处理队列的线程

         if (cq.TryDequeue(out newPacket)) 
         { 
            // Visualize new packet
         }
    
于 2012-09-07T14:51:01.370 回答