Una delle cose belle di linq era avere infinite fonti di dati elaborate pigramente su richiesta. Ho provato a parallelizzare le mie domande e ho scoperto che il caricamento lento non funzionava. Per esempio ...Come faccio a scaricare lentamente con 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;
}
}
Questo programma non riesce a produrre alcun risultato, presumibilmente perché ad ogni passo, la sua attesa per tutte le chiamate al generatore asciugare, che naturalmente non è mai. Se estraggo la chiamata "AsParallel", funziona perfettamente. Quindi, come posso ottenere il mio caricamento lazy durante l'utilizzo di PLINQ per migliorare le prestazioni delle mie applicazioni?
ottimo punto ... il buffering in PLINQ maschera solo i problemi di nessun caricamento lazy. Forse una strada da percorrere è un metodo di estensione che raggruppa i successivi n elementi ed esegue quelli in parallelo, quindi restituisce i risultati. Questo potrebbe produrre un comportamento pseudo-pigro ... – tbischel
@tbischel Sì, qualcosa del genere funzionerebbe. Un'altra opzione sarebbe quella di usare 'BlockingCollection' con il set di' BoundedCapacity'. – svick