我什么时候应该使用并行的foreach,什么时候应该使用并行的linq?

时间:2018-11-12 04:31:43

标签: c# winforms

我已经尝试了下面的这些代码,它可以正常工作并且性能也很好。但是当我运行nunit测试用例时,它不能正常工作。我对并行linq或parallel foreach不了解。是否有可能将代码转换为并行linq 。请 提出您的宝贵建议。

Parallel.ForEach(ListofData, item =>
            {
                if (this.DataSource != null && item != null)
                {
                    string itemText = this.GetListViewItemValue(item, this.displayMember);
                    if (!string.IsNullOrEmpty(this.Text) && itemText.ToLower().Equals(this.Text.ToString().ToLower()))
                    {
                        this.textBox.Text = itemText.ToString();
                        this.textBox.SelectAll();
                        this.listView.SelectedItems.Add(item);
                    }
                }
            });

1 个答案:

答案 0 :(得分:5)

恭喜,您是我的第1000个答案

  

何时应使用并行foreach,何时应使用并行   linq?

它们都做完全相同的事情,都是基于任务并行库构建的,只是语义不同。

看看所有的重载和扩展方法,您会发现有时编写 PLinq 更加容易,有时编写Parallel.For/Foreach

更加容易

对于您的问题,与任何一种方法都没有直接关系。但是,您 ARE 试图从可能不同的线程更新 UI 并注定会失败。

不会失败的唯一原因是内部人员认为这不是线程值得的,并且正在原始上下文中运行。

我认为您确实需要重新考虑您的方法,并且如果您确实想使用多个线程,则需要 Marshal 相应地返回到 UI线程

  

但是当我运行nunit测试用例时,它不起作用

关于您的测试用例...我认为您目前有更大的问题,您的代码不是线程安全的