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

时间:2015-12-25 17:19:35

标签: c# multithreading load-balancing

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

练习是

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

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

我认为我必须做的事情:

  1. 将测量点读入数组
  2. 确保对该阵列的线程安全访问
  3. 为计算某些数学内容的每个值生成一个新线程
  4. 设置最大并发工作线程的最大值
  5. 我是c#中多​​线程应用程序的新手,但我认为使用threadpool是正确的方法。我目前正在编写一个队列,可能在任务中启动它,因此它不会阻止应用程序。

    你会推荐什么?

1 个答案:

答案 0 :(得分:3)

这里有几个环境依赖:

  • 您使用的是哪个版本的.NET?
  • 您使用的是什么UI - 桌面(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。这将使您更好地了解核心和内存是否得到有效使用。通过查看正在处理任务和提供结果的速率来简单地测量任务吞吐量。

请注意,我还没有在此处添加任何代码,因为我假设您要处理教授的实施细节: - )