linq の優れた点の 1 つは、無限のデータ ソースが要求に応じて遅延処理されることです。クエリの並列化を試みたところ、遅延読み込みが機能していないことがわかりました。例えば...
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;
}
}
このプログラムは結果を生成できません。これはおそらく、各ステップで、ジェネレーターへのすべての呼び出しが枯渇するのを待っているためです。「AsParallel」呼び出しを実行すると、問題なく動作します。では、PLINQ を使用してアプリケーションのパフォーマンスを向上させながら、適切な遅延読み込みを取得するにはどうすればよいでしょうか?