2010-02-16 22 views
18

ParallelEnumerable có thành viên tĩnh AsParallel. Nếu tôi có số IEnumerable<T> và muốn sử dụng Parallel.ForEach thì điều đó có nghĩa là tôi phải luôn sử dụng AsParallel?Parallel.ForEach có yêu cầu AsParallel()

ví dụ: Cả hai đều đúng (mọi thứ khác đều bình đẳng)?

mà không AsParallel:

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f)); 

hoặc với AsParallel?

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f)); 

Trả lời

21

Tùy thuộc vào những gì được gọi, chúng là các vấn đề riêng biệt.

.AsParallel() Song song việc đếm liệt kê không phải là nhiệm vụ.

Parallel.ForEach Song song với vòng lặp, gán nhiệm vụ cho chuỗi công nhân cho từng phần tử.

Vì vậy, trừ khi điều tra nguồn của bạn tăng từ trở thành song song (ví dụ: reader.Match(file) là tốn kém), chúng bằng nhau. Đối với câu hỏi cuối cùng của bạn, , cả hai đều đúng.

Ngoài ra, có một cấu trúc khác mà bạn có thể muốn nhìn vào đó sẽ rút ngắn một chút, vẫn nhận được lợi ích tối đa của PLINQ:

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f)); 
+2

Hmmm ... những gì chính xác là parrallelizing kiểu liệt kê? hoặc ít nhất thì việc paralleization đó có thể tách rời khỏi phái đoàn nhiệm vụ được không? – dkackman

+2

@dkackman '.AsParallel()' đọc số đếm để thực hiện song song, cụ thể là phiên bản song song của '.SelectMany()' trong trường hợp này. Hãy suy nghĩ về một mệnh đề có mệnh đề 'Where' khổng lồ nhưng không có thứ tự, chúng ta có thể đánh giá mệnh đề where cùng một lúc với nhiều lõi nhất có thể cho phép tiếp theo trong liệt kê chuỗi tiếp theo, làm cho nó nhanh hơn' n' lần. Những gì chúng ta làm với kết quả đó cũng có thể được xử lý theo cùng một cách sau đó, hoặc đồng bộ trong một luồng hoặc lan truyền qua các lõi khi có sẵn, đó là phần 'Parallel.ForEach' hoặc' .ForAll', có ý nghĩa không? –

+0

Điều đó có ý nghĩa. Cảm ơn Nick. – dkackman

Các vấn đề liên quan