Parallel.ForEach が新しいスレッドを起動しない
みなさん、こんにちは。マイクロソフトの .NET Framework 用 Parallel Extensions の Parallel.ForEach を使用して記述した、非常に IO 集中型の操作があります。大量のファイルを削除する必要があり、削除するファイルをリストのリストとして表します。ネストされた各リストには 1000 個のメッセージがあり、これらのリストは 50 個あります。ここでの問題は、後でログを確認すると、Parallel.ForEach ブロック内で実行されているスレッドが 1 つしかないことです。
コードは次のようになります。
List<List<Message>> expiredMessagesLists = GetNestedListOfMessages();
foreach (List<Message> subList in expiredMessagesLists)
{
Parallel.ForEach(subList, msg =>
{
try
{
Logger.LogEvent(TraceEventType.Information, "Purging Message {0} on Thread {1}", msg.MessageID, msg.ExtensionID, Thread.CurrentThread.Name);
DeleteMessageFiles(msg);
}
catch (Exception ex)
{
Logger.LogException(TraceEventType.Error, ex);
}
});
}
より単純なデータ構造を持ち、IO ロジックを持たないサンプル コードをいくつか書いたところ、Parallel.ForEach ブロック内でいくつかの異なるスレッドが実行されていることがわかりました。上記のコードの Parallel.ForEach で何か間違ったことをしていますか? つまずいているリストのリストである可能性がありますか、それとも IO 操作にある種のスレッド制限がありますか?