2012-02-15 5 views
218

Tôi có một vòng lặp không đồng bộ Parallel.ForEach() mà tôi tải xuống một số trang web. Băng thông của tôi bị giới hạn vì vậy tôi chỉ có thể tải xuống x trang mỗi lần nhưng Parallel.ForEach thực hiện toàn bộ danh sách các trang web mong muốn.Tôi làm cách nào để giới hạn Parallel.ForEach?

Có cách nào để giới hạn số chuỗi hoặc bất kỳ giới hạn nào khác trong khi chạy Parallel.ForEach không?

đang Demo:

Parallel.ForEach(listOfWebpages, webpage => { 
    Download(webpage); 
}); 

Nhiệm vụ thật không có gì để làm với các trang web, vì vậy giải pháp crawl web quảng cáo sẽ không giúp đỡ.

+5

Tôi thấy bạn đang thực hiện một Parallel.ForEach() trên một danh sách - Tôi quá thích sống nguy hiểm. – jKlaus

+0

@jKlaus Nếu danh sách không được sửa đổi, ví dụ: nó chỉ là một tập hợp các URL, tôi thực sự không thể thấy được vấn đề? – Shiv

+0

@Shiv, cho đủ thời gian bạn sẽ ... Đếm số lần thực hiện của bạn và so sánh nó với số lượng danh sách. – jKlaus

Trả lời

394

Bạn có thể chỉ định một MaxDegreeOfParallelism trong một tham số ParallelOptions:

Parallel.ForEach(
    listOfWebpages, 
    new ParallelOptions { MaxDegreeOfParallelism = 4 }, 
    webpage => { Download(webpage); } 
); 

MSDN: Parallel.ForEach

MSDN: ParallelOptions.MaxDegreeOfParallelism

+27

Nó có thể không áp dụng cho trường hợp cụ thể này nhưng tôi figured tôi muốn ném nó ra trong trường hợp bất cứ ai thắc mắc về điều này và thấy nó hữu ích. Ở đây tôi đang sử dụng 75% (được làm tròn) của bộ xử lý. 'var opts = new ParallelOptions { MaxDegreeOfParallelism = Convert.ToInt32 (Math.Ceiling ((Environment.ProcessorCount * 0,75) * 1.0)) }; ' – jKlaus

+2

Chỉ cần tiết kiệm bất cứ ai khác phải nhìn nó trong tài liệu , vượt qua giá trị '-1' giống như không chỉ định nó: _" Nếu [giá trị] là -1, không có giới hạn về số lượng hoạt động đồng thời chạy "_ – stuartd

+0

Nó không rõ ràng với tôi từ tài liệu - thiết lập MaxDegreeOfParallelism thành 4 (ví dụ) có nghĩa là sẽ có 4 luồng mỗi lần chạy 1/4 vòng lặp lặp (một vòng 4 luồng được gửi đi), hoặc mỗi chuỗi vẫn lặp lại một vòng lặp và chúng ta chỉ hạn chế bao nhiêu chạy song song? – Hashman

30

Bạn có thể sử dụng ParallelOptions và thiết lập MaxDegreeOfParallelism để hạn chế số lượng bài đồng thời:

Parallel.ForEach(listOfwebpages, new ParallelOptions{MaxDegreeOfParallelism=2}, webpage => {Download(webpage);});  
18

Sử dụng một tình trạng quá tải khác của Parallel.Foreach mất một phiên bản ParallelOptions và đặt MaxDegreeOfParallelism để giới hạn số lượng phiên bản thực thi song song.

6

Và đối với những người sử dụng VB.net (Cú pháp là kỳ lạ và khó để tìm thấy) ...

Parallel.ForEach(listOfWebpages, New ParallelOptions() With {.MaxDegreeOfParallelism = 8}, Sub(webpage) 
......end sub) 
+0

rất lạ và dường như không có giấy tờ - cảm ơn! –