如何开始创建多线程负载均衡器?

mic*_*l_j 5 c# multithreading load-balancing

我有一个有趣的练习可以从我的教授那里解决.但我需要一些帮助,所以在假期期间不会变得无聊.

演习是为了

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

我有一个csv文本文件,包含5个虚拟传感器的约400个测量点.

我认为我必须做的事情:

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

我是c#中多​​线程应用程序的新手,但我认为使用threadpool是正确的方法.我目前正在编写一个队列,可能在任务中启动它,因此它不会阻止应用程序.

你会推荐什么?

Roa*_*ior 3

这里有几个环境依赖项:

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

我们假设它是 .NET 4.0 或更高版本,并且是一个桌面应用程序。

读取传感器

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

处理计算

然后你需要处理“复杂”的计算。这取决于这些计算的寿命有多长。如果我们假设它们的生命周期很短(比如每个不到 1 秒),那么我认为使用 TaskScheduler标准ThreadPool就可以了。因此,您为每个计算创建一个任务,然后让 TaskScheduler 负责将任务分配给线程。

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

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

测量任务吞吐量和效率

您可以使用PerformanceCounter来测量CPU 和内存的使用情况。这将使您很好地了解内核和内存是否得到有效使用。任务吞吐量可以简单地通过查看任务处理和提供结果的速率来测量。

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