c# 如何重构我的线程程序

标签 c# multithreading

问题

我有源源不断的数据包。每次传入新包时(间隔 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/

相关文章:

c# - 在 Windows 10 通用应用程序中播放音频和视频?

c# - Switch 语句中的大小写顺序是否会影响性能?

Java 同步和可重入锁定

java - GameServer World Management

java - 当前持有锁的线程的定义

c# - 使用客户端 secret 哈希值

c# - 随机字符串 c#

C# - 仅用小时 :minutes:seconds 将字符串解析为 DateTime

multithreading - 在Perl中,如何等待线程并行结束?

python - 正在修改python线程安全中的类变量吗?