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>