2011-07-28 67 views
0

我刚开始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(); 

或者有什么更好的办法吗? 我看到线程池的问题,但我不知道它有什么不同。

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

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

谢谢。请教我!

回答

0

有这么多的线程并不总是增加性能。这取决于你的任务(它是I/O绑定还是CPU绑定)以及你有多少任务。

在.Net 4.0中,您有PLinq库。它会尝试以最佳方式运行你的硬件,这样它就会选择自己的环境需要多少自由度。阅读本文。 http://msdn.microsoft.com/en-us/magazine/cc163329.aspx

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(从文件或网络中读取),它可能非常低效,因为线程花费的时间将浪费在等待数据上。

您能否给我们详细介绍一下您在做什么(您在哪里读取数据以及您如何处理数据)?

+0

谢谢你的指导。其实我发现你说的,parallel.for由TPL提供。而且我也可以高效地获得它。 – Aveugles