Blockiert Parallel.ForEach?

Funktioniert die .netParallel.ForEach Den aufrufenden Thread blockieren? Meine Vermutung bezüglich des Verhaltens ist eine der folgenden:

Ja, es wird gesperrt, bis der langsamste ausgeführte Artikel zurückkehrt.Nein, es blockiert nicht und gibt die Kontrolle sofort zurück. Die Elemente, die parallel ausgeführt werden sollen, werden in Hintergrundthreads ausgeführt.

Oder passiert vielleicht noch etwas, weiß jemand sicher?

Diese Frage tauchte bei der Implementierung in einer Protokollierungsklasse auf:

<code>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};
    }
}
</code>

Beachten Sie dieLogMessage Methode ruft einige andere Protokollierungsdienste auf. Ich brauche diesen Teil, um sofort zurückzukehren, damit er den aufrufenden Thread nicht blockiert.

Update: Basierend auf Kommentaren von anderen (wir haben bestätigt, dass das Verhalten die Nummer 1 ist). Also habe ich mir den Rat gegeben, das zu nutzenAufgabe Bibliothek und schrieb die Schleife wie folgt um:

<code>          if (request.LogMessage)
            foreach (var loggingService in loggingServices)
                Task.Factory.StartNew(() => loggingService.LogMessage(request));
</code>

Antworten auf die Frage(2)

Ihre Antwort auf die Frage