我正在尝试将文本拆分为带有多个拆分字符的单词。
在正常的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(()=>中设置了此代码,但没有用。
谢谢
答案 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%!