Một trong những điều tốt đẹp về LINQ là có nguồn dữ liệu vô hạn được xử lý một cách lười biếng theo yêu cầu. Tôi đã thử song song các truy vấn của mình và thấy rằng tải chậm không hoạt động. Ví dụ:Làm cách nào để tải nội dung tải xuống với PLINQ?
class Program
{
static void Main(string[] args)
{
var source = Generator();
var next = source.AsParallel().Select(i => ExpensiveCall(i));
foreach (var i in next)
{
System.Console.WriteLine(i);
}
}
public static IEnumerable<int> Generator()
{
int i = 0;
while (true)
{
yield return i;
i++;
}
}
public static int ExpensiveCall(int arg)
{
System.Threading.Thread.Sleep(5000);
return arg*arg;
}
}
Chương trình này không tạo ra bất kỳ kết quả nào, có lẽ vì ở mỗi bước, chờ tất cả các cuộc gọi đến máy phát điện sẽ không bao giờ. Nếu tôi đưa ra cuộc gọi "AsParallel", nó hoạt động tốt. Vì vậy, làm thế nào để tôi có được tải lười biếng tốt đẹp của tôi trong khi sử dụng PLINQ để cải thiện hiệu suất của các ứng dụng của tôi?
điểm rất tốt ... bộ đệm trong PLINQ chỉ che giấu các vấn đề không tải chậm. Có lẽ một cách để đi là có một phương pháp mở rộng mà lô các mục tiếp theo n, và thực hiện những người song song, sau đó mang lại kết quả trở lại. Điều đó có thể tạo ra hành vi giả lười biếng ... – tbischel
@tbischel Vâng, một cái gì đó như thế sẽ hoạt động. Một tùy chọn khác là sử dụng 'BlockingCollection' với tập hợp' BoundedCapacity'. – svick