4

私はこれについてかなりの調査を行いましたが、まだ正しく理解できないようです。1000 ページ (ライブラリを使用) の pdf ファイルを生成する必要があり、さまざまなデータに対してこれを N 回実行する必要があります。データは互いに独立しており、これを並行して完全に生成できます。これが私がやろうとしていることです。理想的には、これをたとえば 10 個のスレッドで実行し、各スレッドが pdf をメモリに生成し、最後に保存したいと考えています。pdf (1000 ページ) ごとに 15 分かかるとします。これを順番に行うと、10 個の pdf ファイルで 150 分、10 スレッドを使用すると 30 分になります。人々がスレッド化をあまり好まないことは知っていますが、それ以外の方法で高速化するにはどうすればよいでしょうか?

私は見ていましたが、4.0でThreadPoolこれが新しくなりました。Task使用すると、各タスクを個別のスレッドで強制的に実行できると読みましたTaskCreationOptions.LongRunningが、それはうまくいかないようです。私も使用しようとしThreadPoolましたが、各 PDF は URL から生成されるため、何らかの理由で、WebRequest.Create(url)スレッドプールから呼び出されたときにメソッドが実行されないようです? しかし、新しい Task ライブラリを機能させたいと思います。

これは私が今持っているものですが、まだ順次実行されているようです。

Task myTask= Task.Factory.StartNew(() =>
                {
                  //code for the task.
                  //get html content
                  //generate pdf file.
                }
                }, new CancellationToken(false), TaskCreationOptions.LongRunning, TaskScheduler.Default);

myTask.Wait();

ここで何が間違っていますか?何か提案があれば、私に知らせてください。現時点では、.net 4.0 を超えることはできません。

4

2 に答える 2

11

myTask.Wait()タスクが完了するまで制御スレッドの実行を停止させます...これらのタスクのいずれかを起動した直後に実行を停止したくない場合。

やりたいことは、一度に複数のタスクを作成して開始し、一度にTask.WaitAll(array)1 つずつ待つのではなく、それらがすべて完了するのを待つように呼び出すことです。

// Define your tasks and start them all
var task1 = Task.Factory.StartNew(() => { /*do something*/ });
var task2 = Task.Factory.StartNew(() => { /*do something*/ });
var task3 = Task.Factory.StartNew(() => { /*do something*/ });

// Wait for ALL tasks to finish
// Control will block here until all 3 finish in parallel
Task.WaitAll(new[] { task1, task2, task3 });
于 2013-06-03T23:06:21.287 に答える
0

必要なスレッドの数がわかっていると思われる場合は、先に進んでスレッドを使用する必要があります。これらすべてのスレッドを開始し、すべてが完了するまで待ちます。

于 2013-06-04T01:46:04.537 に答える