Tôi đã quen với việc sử dụng Parallel.For() trong các phần mở rộng song song của .Net vì nó là một cách đơn giản để song song mã mà không cần phải bắt đầu và duy trì các chủ đề (có thể khó sử dụng). Tôi đang nhìn vào một vòng lặp vô hạn (làm điều gì đó cho đến khi tôi báo hiệu nó dừng lại) mà tôi muốn song song, không có một đối số Parallel.For() quá tải để làm điều này vì vậy đã tự hỏi cách tiếp cận tốt nhất ở đây là gì được. Về nguyên tắc tôi chỉ có thể làm như sau: (?)Cách tốt nhất để đạt được Vòng lặp vô hạn song song là gì?
Parallel.For(0, int.Max)
Nhưng tôi nghi ngờ rằng có thể không phải là một dự kiến / mô hình hiệu quả cho logic phân vùng làm việc để xử lý
lựa chọn khác là cái gì đó như:
for(;;)
{
Parallel.For(0, 128, delegate()
{
// Do stuff.
}
}
Nhưng điều đó có vẻ không phù hợp và cũng có thể dẫn đến phân vùng công việc không hiệu quả.
Ngay bây giờ bản năng của tôi là làm điều này bằng tay bằng cách tạo và duy trì chủ đề của riêng tôi, nhưng tôi sẽ quan tâm đến việc nhận được một số phản hồi/ý kiến về điều này. Cảm ơn.
=== CẬP NHẬT ===
Tôi đang sử dụng một phiên bản đơn giản của các mã từ bài viết trong các câu trả lời được chấp nhận (Tôi đã gỡ bỏ các tham số ParallelOptions). Dưới đây là các mã ...
public class ParallelUtils
{
public static void While(Func<bool> condition, Action body)
{
Parallel.ForEach(IterateUntilFalse(condition), ignored => body());
}
private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition)
{
while (condition()) yield return true;
}
}
Một cách sử dụng ví dụ sẽ là:
Func<bool> whileCondFn =() => !_requestStopFlag;
ParallelUtils.While(whileCondFn, delegate()
{
// Do stuff.
});
có bất kỳ Mô hình luồng nào mà bạn có thể tiêu thụ – MethodMan