0

我使用了如下所示的任务,但没有性能提升。我检查了我的方法,该方法在 0-1 秒内执行,但使用 Task(30 个任务),它需要 5-12 秒。如果我犯了任何错误,任何人都可以指导。我想并行运行 30 个并期望在最多 2 秒内完成 30 个。

这是我的代码:

Task[] tasks = new Task[30];
for (int p = 0; p <= dstable.Tables[0].Rows.Count - 1; p++)
{
    MethodParameters newParameter = new MethodParameters();
    newParameter.Name = dstable.Tables[0].Rows[p]["Name"].ToString();

    tasks[p] = Task.Factory.StartNew(() => ParseUri(newParameter));
    Application.DoEvents();
}
try
{
    Task.WaitAll(tasks);
    //Console.Write("task completed");
}
catch (AggregateException ae)
{
    throw ae.Flatten();
}
4

2 回答 2

8

您的思想存在一些重大问题。

  1. 您的 PC 是否有 30 个核心,因此每个核心都可以执行一项任务?我不这么认为
  2. 启动一个单独的线程也需要一些时间。
  3. 每个并发线程都会产生更多开销。
  4. 通过启动更多线程可以更快地解决您的问题吗?只有当所有线程都执行不同的任务时,例如从磁盘读取、查询数据库、计算某些东西等时,才会出现这种情况。在 CPU 上执行所有“高性能”任务的 10 个线程不会带来任何提升,恰恰相反,因为每个线程都需要清理他的烂摊子,然后他才能给下一个线程一些 cpu 时间,而那个线程也需要清理他的烂摊子。

检查此链接 http://msdn.microsoft.com/en-us/library/ms810437.aspx

您可以使用 TPL http://msdn.microsoft.com/en-us/library/dd460717.aspx

他们试图保证并行线程的最大效果。我也推荐这本书 http://www.amazon.com/The-Multiprocessor-Programming-Maurice-Herlihy/dp/0123705916

当您真的想在 2 秒内解决您的问题时,请购买更多 CPU 电源;)

于 2012-07-10T16:35:49.183 回答
0

我认为您可能错过了使用线程的要点。

  • 通过增加操作系统开销,创建许多线程可能会导致更复杂的情况。(上下文切换)
  • 此外,管理代码的执行会更加困难,如果有任何错误,也更难找到和修复错误。

线程的使用可能会给你带来优势

  • 任务需要同时执行
  • 构建响应式 UI
于 2012-07-10T17:01:45.707 回答