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();

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

而且我想知道事件是否包含构造线程优于线程包含事件处理程序。

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

谢谢你。请教我!

4

2 回答 2

0

拥有这么多线程并不总能提高性能。这取决于您的任务(是 I/O 限制还是 CPU 限制)以及您有多少任务。

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

于 2011-07-28T03:12:44.360 回答
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(从文件或网络读取),它可能非常低效,因为大部分时间花费在线程将浪费在等待数据上。

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

于 2011-08-17T03:38:36.443 回答