【发布时间】:2014-10-30 01:51:45
【问题描述】:
我正在开发一个将连接到 x 个硬件设备的应用程序。我已经设计了 ReaderLayer,以便有一个专用线程运行代码以连接到单个设备并连续读取设备数据缓冲区。 reader层的代码如下:
while (true)
{
// read buffer from the reader
IList<IRampActiveTag> rampTagList = ConnectedReader.ReadBuffer();
if (rampTagList != null && rampTagList.Any())
{
// trigger read event handler
if (ReadMessage != null)
ReadMessage(this, new RampTagReadEventArg(rampTagList));
}
}
在 Reader 层之上构建了一个逻辑层,负责处理从 Reader 接收到的数据并通过 HTTP Post 转发。它有 y 个线程,每个线程都运行一个单独的逻辑块,该逻辑块必须处理写入其线程安全队列的相关信息。逻辑层订阅阅读器层公开的ReadForward事件,并通过写入其ConcurrentQueue将该数据转发到相关逻辑块。
每个逻辑块中的代码都非常简单:
public void ProcessLogicBuffer()
{
while (true)
{
// Dequeue the list
IRampActiveTag tag;
LogicBuffer.TryDequeue(out tag);
if (tag != null)
{
ProcessNewTagReceivedLogic(tag);
Console.WriteLine("Process Buffer #Tag {0}. Buffer Count #{1}", tag.NewLoopId, LogicBuffer.Count);
}
}
}
读取器层和逻辑层while(true) 的循环布局基本相同。然而,当我使用 3 个阅读器和 3 个逻辑块进行测试时,我发现我的 CPU 利用率跃升至 77%。我很快将 CPU 使用率缩小到逻辑线程,因为我收到了 50% 的 2 使用率和 25% 的使用率 1 块。
我可以通过在具有 3 个块的逻辑线程中添加 Thread.Sleep(100) 将 CPU 使用率降低到 ~3%,但是,我担心我的逻辑可能不同步。通过查看示例,任何人都可以向我提出任何改进建议,因为生产代码需要使用大约 30 个逻辑块。我需要改变我的架构吗?
【问题讨论】:
标签: c# .net multithreading