linqに関する素晴らしい点の1つは、リクエストに応じて遅延して処理される無限のデータソースを持つことでした。クエリを並列化しようとしましたが、遅延ロードが機能していないことがわかりました。たとえば...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;
}
}
このプログラムは、おそらく各ステップで、もちろん決して枯渇する発電機へのすべての呼び出しのための待ち時間を、任意の結果を生成するために失敗しました。私が "AsParallel"呼び出しを取り出すと、正常に動作します。では、PLINQを使用してアプリケーションのパフォーマンスを向上させながら、どうやって怠惰なローディングを得るのですか?
非常に良い点... PLINQでのバッファリングは、遅延ロードがないという問題のみをマスクします。たぶん行く方法は、次のn個のアイテムをバッチ処理し、それらを並列に実行して結果を返す拡張メソッドを持つことです。それは擬似怠惰な行動を生み出すことができます... – tbischel
@tbischelうん、そういうものがうまくいくでしょう。もう一つのオプションは 'BoundedCapacity'がセットされた' BlockingCollection'を使うことです。 – svick