Блокирует ли Parallel.ForEach?
Работает ли .netParallel.ForEach заблокировать вызывающий поток? Мое предположение относительно поведения является одним из них:
Yes, it blocks until the slowest item executing returns. No, it doesn't block and returns control immediately. The items to run in parallel are done on background threads.Или, может быть, что-то еще происходит, кто-нибудь знает наверняка?
Этот вопрос возник при реализации этого в классе журналирования:
<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>
Обратите внимание наLogMessage
Метод вызывает некоторые другие службы регистрации. Мне нужно, чтобы эта часть вернулась немедленно, чтобы она не блокировала вызывающий поток.
Обновление: на основе комментариев от других (мы подтвердили, что поведение # 1). Поэтому я принял совет, чтобы использоватьзадача библиотека и переписать цикл следующим образом:
<code> if (request.LogMessage) foreach (var loggingService in loggingServices) Task.Factory.StartNew(() => loggingService.LogMessage(request)); </code>