¿Parallel.ForEach Bloquea?

Hace la función .netParalelismo.para cada bloquear el hilo de llamada? Mi conjetura sobre el comportamiento es uno de estos:

Sí, bloquea hasta que vuelva el elemento más lento ejecutándose.No, no bloquea y devuelve el control inmediatamente. Los elementos para ejecutar en paralelo se realizan en subprocesos de fondo.

O tal vez algo más está sucediendo, alguien sabe con seguridad?

Esta pregunta surgió al implementar esto en una clase 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 laLogMessage Método llama a algunos otros servicios de registro. Necesito que esa parte regrese inmediatamente, para que no bloquee el hilo de llamada.

Actualización: basado en comentarios de otros (hemos confirmado que el comportamiento es # 1). Así que he tomado consejos para usar elTarea Biblioteca y reescrito el bucle de esta manera:

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta