O Parallel.ForEach Block?

A função .netParalelo.ParaCada bloquear o segmento de chamada? Meu palpite quanto ao comportamento é um desses:

Sim, bloqueia até que o item mais lento em execução retorne.Não, não bloqueia e devolve o controle imediatamente. Os itens a serem executados em paralelo são feitos em encadeamentos em segundo plano.

Ou talvez algo mais esteja acontecendo, alguém sabe ao certo?

Esta questão surgiu ao implementar isso em uma classe de registro:

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

Observe oLogMessage método chama alguns outros serviços de log. Eu preciso dessa parte para retornar imediatamente, por isso não bloqueia o segmento de chamada.

Atualização: Com base nos comentários de outras pessoas (confirmamos que o comportamento é o nº 1). Então eu tomei conselhos para usar oTarefa biblioteca e reescreveu o loop assim:

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

questionAnswers(2)

yourAnswerToTheQuestion