Có cách nào dễ dàng để bước qua song song.foreach không? Cách tốt nhất để gỡ lỗi này với một điểm break là gì?Parallel.ForEach Debug hoặc Step Through
Trả lời
Bạn thực sự có thể nhận được kết quả tương tự với Visual Studio chỉ bằng cách đóng băng tất cả các chủ đề ngoại trừ một, chọn tất cả các chủ đề nhưng một trong cửa sổ Threads và nhấp chuột phải -> Freeze như thế này:
Ngoài ra, nếu bạn muốn để tái tạo một điều kiện chủng tộc và dừng lại trên breakpoint phá vỡ nó, bạn luôn có thể thêm tracepoints - hoặc với visual studio hoặc với các plugin giúp với nó, chẳng hạn như Oz Mã
Tạm thời viết lại dưới dạng tham chiếu không song song hoặc sử dụng chỉ thị tiền xử lý để thực thi mã không song song khi chạy trong chế độ gỡ lỗi.
Trong khi gỡ lỗi, tôi thường cài đặt Parallel.ForEach
của mình để chạy với MaxDegreeOfParallelism
được đặt thành 1. Điều này khiến cho việc gỡ lỗi trở nên đơn giản hơn rất nhiều.
const bool forceNonParallel = true;
var options = new ParallelOptions { MaxDegreeOfParallelism = forceNonParallel ? 1 : -1 };
Parallel.ForEach(collection, options, item =>
{ //...
Tuy nhiên, điều này sẽ không giúp gỡ lỗi các vấn đề liên quan đến điều kiện chủng tộc hoặc đồng bộ hóa dữ liệu.
Những vấn đề thường có thể được sửa lỗi dễ dàng hơn nhiều bằng cách sử dụng các công cụ mới trong VS 2010, chẳng hạn như Parallel Tasks window, hoặc bằng cách sử dụng các kỹ thuật khác nhau được liệt kê trong Debugging Multithreaded Applications như switching threads, khóa đề khi bước vv
Bạn có biết bất kỳ tài liệu nào cho "-1" không? Bài báo msdn nói rằng một lỗi sẽ được ném nếu nó được đặt thành 0 hoặc bất kỳ giá trị nào dưới -1, nhưng không giải thích được -1. – granadaCoder
@granadaCoder Xem https://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism%28v=vs.110%29.aspx "Nếu đó là -1, không có giới hạn về số lượng hoạt động đồng thời chạy. " –
Ga! Tôi đã không đọc đủ xa. Cám ơn. – granadaCoder
Tôi thích sử dụng tùy chọn "Khi nhấn" trên điểm ngắt (nhấp chuột phải vào điểm ngắt, chọn "Khi nhấn ...". Bạn có thể in thông báo tới bảng điều khiển bao gồm các giá trị của biến, chuỗi bạn đang truy cập , v.v.
Tương tự như các câu trả lời khác ở đây, chúng tôi đặt mức độ song song thành 1 khi gỡ lỗi, nhưng chúng tôi thực hiện việc này bằng phương pháp mở rộng, như:
public static ParallelQuery<TSource> AsDebugFriendlyParallel<TSource>(this IEnumerable<TSource> source)
{
var pQuery = source.AsParallel();
#if DEBUG
pQuery = pQuery.WithDegreeOfParallelism(1);
#endif
return pQuery;
}
Sau đó, thay vì sử dụng .AsParallel()
chúng tôi sử dụng .AsDebugFriendlyParallel()
OzCode sẽ giúp bạn rất nhiều, nó có một tính năng như tracepoints trên steroid đó là siêu hữu ích khi debuging đồng thời đang \ song song https://www.youtube.com/watch?v=_vuMi-3jGwY
nếu bạn không quan tâm đến việc gỡ lỗi song song, và chỉ muốn kiểm tra những gì đang xảy ra bên trong vòng lặp, sao chép nó vào một nối tiếp foreach và bước qua nó (bình luận ra song song cho sản xuất) – Dimitri
@Dimitri an toàn hơn/đơn giản hơn để làm cho 'Parallel.ForEach' chạy tuần tự để gỡ lỗi. –
@Reed - yep đó là lý do tại sao tôi upvoted câu trả lời của bạn. Không bao giờ nghĩ về nó trước – Dimitri