Parallel.ForEach - 第一个线程运行慢于其余

时间:2016-10-02 17:35:09

标签: c# multithreading

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

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

正在发生的事情是,要处理的第一个文件似乎需要比其余文件更长的时间来完成,事实上,在低分辨率视频文件上,该线程完全挂起,而其余文件在帧中放大。有时,该线程根本无法完成,而其余线程则通过其余文件运行。

我相信如果主线程被用于处理,可能会引起这种情况,并且会被其他线程的调用所阻止。

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

以下是该应用程序的屏幕截图,显示了第一个在其余部分后面运行的线程 Motion application

代码

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

1 个答案:

答案 0 :(得分:0)

在Henk Holterman的评论帮助下,我发现原因是由于UI线程调用了Parallel.ForEach,因为它应该是后台工作线程,以保持UI线程免费。

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