Блокирует ли функция.net Parallel.ForEach вызывающий поток? Я предполагаю, что поведение является одним из этих:
Или, возможно, происходит что-то еще, кто-нибудь знает наверняка?
Этот вопрос возник при реализации этого в классе ведения журнала.:
public class MultipleLoggingService : LoggingServiceBase
{
private readonly List loggingServices;
public MultipleLoggingService(List 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};
}
}
Обратите внимание, что метод LogMessage
вызывает некоторые другие службы ведения журнала. Мне нужно, чтобы эта часть возвращалась немедленно, чтобы она не блокировала вызывающий поток.
Обновление:Основываясь на комментариях других (, мы подтвердили, что поведение #1). Поэтому я последовал совету использовать библиотеку Task и переписал цикл следующим образом:
if (request.LogMessage)
foreach (var loggingService in loggingServices)
Task.Factory.StartNew(() => loggingService.LogMessage(request));