هل التوازي.
-
20-09-2019 - |
سؤال
ParallelEnumerable
لديه عضو ثابت AsParallel
. إذا كان لدي IEnumerable<T>
وترغب في الاستخدام Parallel.ForEach
هل هذا يعني أنني يجب أن أستخدم دائمًا AsParallel
?
على سبيل المثال ، كل من هذين صحيحان (كل شيء آخر متساوي)؟
بدون AsParallel
:
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f));
أو مع AsParallel
?
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
المحلول
يعتمد ذلك على ما يسمى ، فهي قضايا منفصلة.
.AsParallel()
موازية تعداد ليس وفد المهام.
Parallel.ForEach
موازية عقدة, ، تعيين المهام لخيوط العمال لكل عنصر.
لذلك ما لم يصبح تعداد المصدر الخاص بك من أن يصبح بالتوازي (على سبيل المثال reader.Match(file)
باهظ الثمن) ، فهي متساوية. لسؤالك الأخير ، نعم, كلاهما صحيح أيضا.
أيضًا ، هناك بنية أخرى قد ترغب في إلقاء نظرة على هذا التقصير قليلاً ، لا تزال تحصل على أقصى فائدة من Plinq:
GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));
لا تنتمي إلى StackOverflow