【发布时间】: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