Блокирует ли Parallel.ForEach?

Блокирует ли функция.net Parallel.ForEach вызывающий поток? Я предполагаю, что поведение является одним из этих:

  1. Да, он блокируется до тех пор, пока не вернется самый медленный выполняемый элемент.
  2. Нет, не блокирует и сразу возвращает управление. Элементы для параллельного выполнения выполняются в фоновых потоках.

Или, возможно, происходит что-то еще, кто-нибудь знает наверняка?

Этот вопрос возник при реализации этого в классе ведения журнала.:

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));

47
задан Paul Fryer 14 April 2012 в 13:12
поделиться