.net関数Parallel.ForEachが呼び出しスレッドをブロックしていますか?行動に関する私の推測は、次のいずれかです:Parallel.ForEachはブロックしますか?
- はい、最も遅いアイテムが実行されるまでブロックされます。
- いいえ、ブロックしないでコントロールをすぐに返します。並行して実行される項目は、バックグラウンドスレッドで実行されます。
おそらく、誰かが確実に知っていることはありますか?ログクラスでこれを実装するとき
この質問は、思い付いた:
public class MultipleLoggingService : LoggingServiceBase
{
private readonly List<LoggingServiceBase> loggingServices;
public MultipleLoggingService(List<LoggingServiceBase> loggingServices)
{
this.loggingServices = loggingServices;
LogLevelChanged += OnLogLevelChanged;
}
private void OnLogLevelChanged(object sender, LogLevelChangedArgs args)
{
loggingServices.ForEach(l => l.LogLevel = LogLevel);
}
public override LogMessageResponse LogMessage(LogMessageRequest request)
{
if (request.LogMessage)
Parallel.ForEach(loggingServices, l => l.LogMessage(request));
return new LogMessageResponse{MessageLogged = request.LogMessage};
}
}
LogMessage
方法は、いくつかの他のロギングサービスを呼び出して注意してください。私はその部分をすぐに返す必要があるので、呼び出しスレッドをブロックしません。
更新:他の人のコメントに基づいています(動作は#1であることが確認されています)。だから私はTaskライブラリを使用するようにアドバイスを取り、このようなループを書き換えています
if (request.LogMessage)
foreach (var loggingService in loggingServices)
Task.Factory.StartNew(() => loggingService.LogMessage(request));
感謝を!このコンテキストで「タスク」を使用する方法について少しコードスニペットがありますか?ありがとう、ポール –
@PaulFryer: 'タスクt = Task.TaskFactory.StartNew(()=> {/ * Parallel.For行く* /}); ' – Richard
技術的には、呼び出し元スレッドは並列ループで使用されます。つまり、ループをブロックするだけではなく、ワーカースレッドの1つとして使用されます。 –