Czy Parallel.ForEach Block?

Czy funkcja .netParallel.ForEach zablokować wątek wywołujący? Moje przypuszczenie co do zachowania jest jednym z nich:

Tak, blokuje się, dopóki nie powróci najwolniejszy element.Nie, nie blokuje i nie zwraca kontroli natychmiast. Elementy uruchamiane równolegle są wykonywane na wątkach tła.

A może dzieje się coś innego, ktoś na pewno wie?

To pytanie pojawiło się podczas implementowania tego w klasie logowania:

<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>

Zwróć uwagę naLogMessage metoda wywołuje inne usługi rejestrowania. Potrzebuję tej części do natychmiastowego powrotu, aby nie blokowała wywołującego wątku.

Aktualizacja: W oparciu o komentarze innych (potwierdziliśmy, że zachowanie jest # 1). Więc poradziłem, aby użyćZadanie biblioteka i przepisałem pętlę w ten sposób:

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

questionAnswers(2)

yourAnswerToTheQuestion