如何进行多线程测试?

时间:2011-07-28 03:03:11

标签: multithreading events performance-testing

我刚刚开始进行C#编程学习。 这些天我正在研究.NET 4.0中指定计算的性能测试。 系统读取并复制大量数据,并由我自己的函数进行评估。

我会尝试使用多线程系统为300多个数据集做到这一点。 所有线程都是从接收数据开始的,所以我将使用EventHandler继续这部分。

我对如何构造线程感到困惑。 当然,我可以将它们作为List并逐个工作,如:

Function la = new Function();
List<Thread> threadSet = new List<Thread>();
for (int i = 0; i < 300; i++)
  threadSet.Add(new Thread(new ThreadStart(la.doWork)));
for (int i = 0; i < 300; i++)
  threadSet[i].Start();

还是有更好的方法吗? 我看到了线程池问题,但我不知道与此有何不同。

我想知道事件是否包含构造线程更好的线程包括事件处理程序。

英语不是我的母语,所以也许我对于我的问题表达错误。

谢谢。请教我!

2 个答案:

答案 0 :(得分:0)

拥有如此多的线程并不总能提高性能。这取决于您的任务(是I / O绑定还是CPU绑定)以及您拥有的任务数量。

在.Net 4.0中,您有PLinq库。它将尝试为您的硬件以最佳方式运行,因此它将选择对您的环境需要多少的并行性。阅读本文。 http://msdn.microsoft.com/en-us/magazine/cc163329.aspx

答案 1 :(得分:0)

<。>使用.Net 4.0,完成相同操作的最简单方法是:

Parallel.For(0,300, _ => la.doWork() );
// or with plinq
Enumerable.Range(1,300).AsParallel().ForAll(_ => la.doWork() );

这些解决方案的优点是您不必处理线程创建和管理,并使用它来混淆代码。 我应该注意,这不一定会为每个工作项创建一个线程。

现在这个代码只有在la.dowork()是一个只有CPU的任务时才是最佳的。如果它涉及任何I / O(从文件或网络中读取),它可能效率非常低,因为很长一段时间线程花费的时间会浪费在等待数据上。

你能否详细介绍一下你在做什么(你在哪里阅读数据以及你用它做什么)?