gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:32:02 25 4
gpt4 key购买 nike

问题

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com