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