私は、基本的にDBからデータを取得し、メモリにExcelを作成し、DBのようにExcelを保存するレポート生成Windowsサービスに取り組んでいますbyte[]
。物事をスピードアップするために、TPL を使用することにしました。以下は、私が作成したコードです。
List<ReportData> lstRd = new List<ReportData>();
List<Task> tasks = new List<Task>;
foreach (var item in lstRd)
{
tasks.Add(Task.Factory.StartNew(GenerateReport()));
}
Task.WaitAll(tasks.ToArray());
tasks.ForEach(x=>
if(!x.IsCompleted)
x.Wait());
Task.Factory.ContinueWhenAll(tasks.ToArray(),StopService());
GenerateReport()
メソッドは、レポートごとに DB からデータを取得し、Excel を作成してbyte[]
db に保存します。したがって、基本的にこれは時間がかかり、メモリを集中的に使用する操作です。
問題
私の問題は、サーバーでタスク マネージャーが表示されるたびに、プロセスが使用されているメモリを解放していないように見えることです。1 つのタスクが完了し (フラグが DB で処理されたときに更新されたときに完了すると仮定します)、もう 1 つのタスクが DB からのデータの取得を待機している場合、タスク マネージャーで使用されるメモリは同じままで、2 番目のタスクが処理を開始すると、使用されるメモリは増え続けます。
Dispose()
私は、TPL が完了すると自動的にタスクを実行し、GC がメモリを解放することを期待していました。しかし、メモリは使用され続け、最終的にはメモリ例外が発生します。
私は何かを見逃していますか、何か間違っていますか?レポート生成メソッドのコード全体を投稿するのは難しいですが、必要に応じて一部を投稿しようと思います。