gpt4 book ai didi

c# - 如何开始创建多线程负载平衡器?

转载 作者:太空狗 更新时间:2023-10-29 23:29:46 26 4
gpt4 key购买 nike

我有一个有趣的练习要从我的教授那里解决。但我需要一点帮助,以免假期变得无聊。

练习是为了

  • 创建一个多线程负载平衡器,每秒从 5 个传感器读取 1 个测量点。 (因此每秒 5 个值)。
  • 然后用这些值做一些“复杂”的计算。
  • 在屏幕上打印计算结果。 (比如传感器1-5的最大值或平均值等等,当然是多线程的)
  • 作为一项附加任务,我还必须确保如果将来每秒读取 500 个传感器,计算机不会退出作业。(负载平衡)。

我有一个 csv 文本文件,其中包含来自 5 个假想传感器的约 400 个测量点。

我认为我必须做的:

  1. 将测量点读入数组
  2. 确保对该数组的线程安全访问
  3. 为计算一些数学内容的每个值生成一个新线程
  4. 为最大并发工作线程数设置一个最大值

我是 c# 中多线程应用程序的新手,但我认为使用线程池是正确的方法。我目前正在处理一个队列,可能会在任务中启动它,这样它就不会阻塞应用程序。

你会推荐什么?

最佳答案

这里有几个环境依赖:

  • 您使用的是什么版本的 .NET?
  • 您使用的是什么用户界面 - 桌面 (WPF/WinForms) 还是 ASP.NET?

我们假设它是 .NET 4.0 或更高版本和桌面应用程序。

读取传感器

在 WPF 或 WinForms 应用程序中,我会使用单个 BackgroundWorker从传感器读取数据。每秒 500 次读取是微不足道的 - 即使是 500,00 通常也是微不足道的。 BackgroundWorker 类型专为与桌面应用程序交互而设计,例如将结果传递给 UI 而无需担心线程交互。

处理计算

然后您需要处理“复杂”的计算。这取决于这些计算的生命周期。如果我们假设它们是短暂的(比如每个不到 1 秒),那么我认为使用 TaskScheduler和标准ThreadPool会没事的。所以你创建了一个 Task对于每个计算,然后让 TaskScheduler 负责将任务分配给线程。

TaskScheduler 的工作是通过将轻量级任务排队到更重量级的线程来平衡工作,并管理 ThreadPool 以最好地平衡工作负载与机器上的内核数量。你甚至可以override the default TaskScheduler以您想要的任何方式安排任务。

ThreadPool 是需要处理的工作项的 FIFO 队列。在 .NET 4.0 中,ThreadPool 通过使工作队列成为线程安全的来提高性能 ConcurrentQueue收藏。

测量任务吞吐量和效率

您可以使用 PerformanceCounter测量两者 CPU and memory usage .这将使您清楚地了解内核和内存是否得到有效使用。任务吞吐量可以通过查看任务的处理速度和提供结果的速度来简单地衡量。

请注意,我没有在此处包含任何代码,因为我假设您想为您的教授处理实现细节:-)

关于c# - 如何开始创建多线程负载平衡器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34464865/

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