我遇到了一个问题,我从UI线程调用Parallel.ForEach
导致UI冻结,第一个线程运行速度很慢而没有跟上其余部分。
我在这里读到:Why does this Parallel.ForEach code freeze the program up?这是一件坏事,然后我发现代码Task.Factory.StartNew(() =>
包围Parallel.ForEach
命令以便从而不是后台工作者。
问题在于我不断收到Parallel.ForEach
代码的例外情况,但One or more errors occurred
中没有e.Message
以外的其他信息。
我做错了什么?
Task.Factory.StartNew(() =>
{
try
{
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);
});
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
});
答案 0 :(得分:-1)
对于那些有相同问题的人,在任何类型的后台线程中,请尽量不要使用任何依赖于UI的变量,例如Text或ListViewItems。要使用这些变量,请在调用后台任务之前将它们放入新变量中。然后在任务中使用此变量。
ListViewItem myIndependentList = filesListView.Items.Cast<ListViewItem>();