私はかなり単純なRaytracerを書いています。プログラムはシングルスレッドなので実行時の制限があります。私がGoogleから見つけた結果は、このタイプの質問に2〜3つのタスクで対処して回答しています。多量のタスク/スレッドを作成してそれらがすべて完了するのを待つ
class Program
{
static void Main(string[] args)
{
var taskList = new List<Task>();
taskList.Add(Task.Factory.StartNew(() => doStuff()));
taskList.Add(Task.Factory.StartNew(() => doStuff()));
taskList.Add(Task.Factory.StartNew(() => doStuff()));
Task.WaitAll(taskList);
Console.WriteLine("All threads complete");
}
static void doStuff()
{
//do stuff here
}
}
純粋に実装されていれば、少なくとも10,000個のスレッドがあります。上記のソリューションは、このシナリオでは最適なソリューションとは思われません。これをサポートしている標準ライブラリの一部がありますか、または実装されているようなNugetパッケージがありますか?また、私は馬鹿だと思うかもしれませんし、Listの> 10,000スレッドはまったく問題ではありません。カットオフ時に問題が発生します。いくつかのインスタンスでは12500000個のタスク/スレッドが必要になりますが、これはリストには多すぎます。
以下は、私が新しいスレッド/タスクを作成する方法の概略です。あなたが複数のスレッドを使用して処理したい値のリスト(またはその他のIEnumerable<T>
)をお持ちの場合
for (var x = 0; x < image.Width; x++) {
for (var y = 0; y < image.Height; y++) {
var coordinates = new Vector3(x, y, 0);
var task = new Task(() => {
RenderSinglePixel(coordinates);
});
}
}
の全体の速度が遅くなります。 –
それも私が思ったことです。私の状況に対処する適切な方法は何ですか? – Herbstein
例を追加しようとします。 –