Tôi có một vòng lặp Parallel.ForEach() lấy danh sách URL và tải xuống từng URL để xử lý bổ sung. Bên ngoài vòng lặp của tôi, tôi đã khai báo biến vòng lặp và bên trong thân vòng lặp mà tôi sử dụng Interlocked.Increment(), đây là cách tốt nhất để giữ một cách "an toàn luồng" để tăng số đếm khi mỗi vòng lặp được thực hiện.Interlocked.Increment() không hoạt động theo cách tôi mong đợi trong Thư viện song song nhiệm vụ
int counter = 0;
Parallel.ForEach(urlList, (url, state) =>
{
// various code statments
Interlocked.Increment(ref counter);
Debug.WriteLine(" ......... counter: " + counter);
});
Tôi đã có thể nghĩ rằng tôi sẽ thấy một cái gì đó tương tự như:
......... 1
......... 2
......... 3
......... 4
......... 5
.........
.........
......... n
Nhưng những gì tôi nhận được thay vào đó là 16 "......... 0" (điều này là bởi vì tôi có một máy tính lõi tứ kép với 8 lõi bản địa, nhưng siêu luồng được kích hoạt cho tôi tổng cộng 16 lõi). Sau đó, tôi sẽ bắt đầu thấy bộ đếm được tăng lên bình thường cho hầu hết các phần nhưng đôi khi tôi sẽ thấy các giá trị truy cập trùng lặp hoặc thậm chí ba lần trong đầu ra Gỡ lỗi.
Sử dụng Parallel.ForEach() cách tốt nhất để đếm lặp vòng lặp là gì? Cảm ơn lời khuyên nào.
Giá trị trùng lặp được mong đợi. Nhưng tôi không hiểu 0s đến từ đâu. – CodesInChaos
Một work-around đang sử dụng int 'myCounter = Interloced.Increment (ref counter); Debug.WriteLine (myCounter); ' – CodesInChaos
Bạn có thể đăng một số mã thực sự biên dịch và trình bày vấn đề (ví dụ: in 0s) không? – CodesInChaos