سؤال

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));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top