【问题标题】:Parallel.ForEach - First thread runs slower than the restParallel.ForEach - 第一个线程比其他线程运行得慢
【发布时间】:2016-10-02 17:35:09
【问题描述】:

这是一个奇怪的问题,我无法从搜索中找到太多信息。

我有一个列表视图控件,其中包含视频文件列表。我使用 Parallel.ForEach 运行单独的线程来逐帧处理每个视频文件以进行运动。每个帧循环都包含一些调用来更新表单上的控件,我假设主线程 (ID 1) 处理这些控件。

发生的情况是,要处理的第一个文件似乎比其他文件需要更长的时间才能完成,事实上,在低分辨率视频文件上,该线程完全挂起,而其他文件则通过帧进行缩放。有时该线程根本不会完成,而其余线程会通过其余文件运行。

我相信这可能是由于主线程正在用于处理,并且被其他线程的调用所阻碍。

编辑:我注意到当另一个表单打开时线程完全挂起。

这是应用程序的屏幕截图,显示了在其余线程后面运行的第一个线程

代码

 Parallel.ForEach<ListViewItem>(filesListView.Items.Cast<ListViewItem>(), new ParallelOptions() { MaxDegreeOfParallelism = Convert.ToInt32(Math.Ceiling((Environment.ProcessorCount * 0.75) * 1.0)) }, (item, state) =>
     {
         Thread.Sleep(100);
             if (CallToStop == true)
             {
                 state.Break();
             }
             internalProcessStart(item);
      });

【问题讨论】:

  • 可能与文件大小有关吗?
  • 您是否尝试完全删除调用,并检查这是否相关?
  • @TadijaBagarić 与文件大小无关,我尝试一遍又一遍地复制同一个文件,它也发生在那里。
  • 向我们展示您如何以及在何处调用 ForEach。 “当另一个表单打开时挂起”表示您从主线程调用它。你不应该。
  • 您的代码应该已经是线程安全的,所以只需从池线程(Backgroundworker)调用 ForEach。

标签: c# multithreading


【解决方案1】:

在 cmets 的 Henk Holterman 的帮助下,我发现原因是由于在 UI 线程应该是后台工作线程时调用了 Parallel.ForEach,以保持 UI 线程空闲。

当我的代码使用正确的代码时,我会更新这个答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多