Jedną z miłych rzeczy o linq było posiadanie nieskończonych źródeł danych przetwarzanych leniwie na żądanie. Próbowałem zsynchronizować moje zapytania i okazało się, że leniwe ładowanie nie działa. Na przykład ...Jak uzyskać leniwy załadunek za pomocą 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;
}
}
Ten program nie przynosi żadnych rezultatów, przypuszczalnie dlatego, że na każdym kroku, jego oczekiwania dla wszystkich połączeń z generatora wysychać, co oczywiście nie jest. Jeśli wezmę połączenie "AsParallel", działa dobrze. Jak mogę uzyskać ładną, leniwą ładowanie podczas korzystania z PLINQ, aby poprawić wydajność moich aplikacji?
Bardzo dobry punkt ... buforowanie w PLINQ tylko maskuje problemy z brakiem leniwego ładowania. Być może sposobem na przejście jest metoda rozszerzenia, która ładuje następne n elementów i wykonuje je równolegle, a następnie zwraca wyniki. To mogłoby wywołać pseudo leniwą reakcję ... – tbischel
@tbischel Tak, coś takiego by działało. Inną opcją byłoby użycie 'BlockingCollection' z ustawieniem' BoundedCapacity'. – svick