从后台工作线程调用Parallel.ForEach

时间:2016-10-02 19:52:08

标签: c# multithreading parallel-processing

我遇到了一个问题,我从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);
    }
});

1 个答案:

答案 0 :(得分:-1)

对于那些有相同问题的人,在任何类型的后台线程中,请尽量不要使用任何依赖于UI的变量,例如Text或ListViewItems。要使用这些变量,请在调用后台任务之前将它们放入新变量中。然后在任务中使用此变量。

ListViewItem myIndependentList = filesListView.Items.Cast<ListViewItem>();