Параллельно ForEach и Tasks не работают SAFE - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь разделить текст на слова с несколькими символами разделения.

С обычным ForEach я получил 590 слов, но когда я использую Parallel.ForEach или Task, я получаю случайный счетслов: 560, 583, 579, ....

Я также использовал 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());

           }
 }

что за проблема с этим?я просто изменяю обычный foreach с помощью Parallel.ForEach или устанавливаю этот код внутри новой задачи (() =>, но не работает.

спасибо

1 Ответ

0 голосов
/ 04 октября 2018

Как упомянул @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, этот параллелизм не означает, что вы получите повышение производительности, вы должны измерять его с параллелизмом и без него.

@ Примечание Шаян Фирози:
Спасибо, ребята!

Как результат, да, вы правы, параллелизм не делает этот код быстрее, а иногда и делает его медленнее!

Но для меня было удивительнымскорость LINQ .Всегда учил, что LINQ намного медленнее, чем традиционный для / foreach , но в этом случае мой код работает на 50% быстрее !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...