我有一个有趣的练习可以从我的教授那里解决。但我需要一些帮助,所以在假日期间不会变得无聊。
练习是
我有一个csv文本文件,其中包含来自5个虚构传感器的约400个测量点。
我认为我必须做的事情:
我是c#中多线程应用程序的新手,但我认为使用threadpool是正确的方法。我目前正在编写一个队列,可能在任务中启动它,因此它不会阻止应用程序。
你会推荐什么?
答案 0 :(得分:3)
这里有几个环境依赖:
让我们假设它是.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。这将使您更好地了解核心和内存是否得到有效使用。通过查看正在处理任务和提供结果的速率来简单地测量任务吞吐量。
请注意,我还没有在此处添加任何代码,因为我假设您要处理教授的实施细节: - )