并行ForEach和任务不起作用SAFE

时间:2018-10-04 07:33:52

标签: c# foreach parallel-processing

我正在尝试将文本拆分为带有多个拆分字符的单词。

在正常的ForEach中,我有590个单词,但是当我使用Parallel.ForEach或Task时,我得到的单词是随机数: 560,583,579,.... < / p>

我还使用了 Task.WaitAll(mytasklis),但是也没有用。

这是我的代码:

foreach (string _Word_ in _Input_Text.Split(_split_chars)) 
 {

      if ((_Word_.Length != 0) && (_Word_.Length <= 50) && 
         (string.IsNullOrEmpty(_Word_) == false))
           {

              ALL_WORDS.Add(_Word_.ToLower());

           }
 }

这是什么问题?我只是用Parallel.ForEach更改了普通的foreach或在新Task(()=>中设置了此代码,但没有用。

谢谢

1 个答案:

答案 0 :(得分:-1)

如@John所述,您应该使用线程安全的集合,例如ConcurrentBag

或者您可以像这样使用LINQ的功能:

var ALL_WORDS = _Input_Text.Split(_split_chars)
    .AsParallel()
    .Where(x => x.Length != 0 && x.Length <= 50 && !string.IsNullOrEmpty(x))
    .ToList();

注意:正如@Matthew Watson和@bommelding所提到的,这种并行性并不意味着您将获得性能上的提升,应该在有无并行性的情况下对其进行测量。

@Shayan Firoozi的笔记:
谢谢你们!

结果是,是的,您是对的,并行性不会使此代码更快,有时也会使其变慢!

但是对我来说,令人惊奇的是 LINQ 的速度。 始终教导 LINQ 比传统的 for / foreach 慢得多,但是在这种情况下,我的代码运行速度快了 50%