L' .fonction réseau Parallèle.ForEach bloquer le thread appelant? Je suppose que le comportement est l'un de ces:
- Oui, il bloque jusqu'à ce que le plus lent du point de l'exécution de retours.
- Non, il ne bloque pas et retourne le contrôle immédiatement. Les éléments à exécuter en parallèle sont effectuées sur les threads d'arrière-plan.
Ou peut-être quelque chose d'autre se passe, quelqu'un sait pour sûr?
Cette question s'est posée lors de la mise en œuvre de cette dans une classe de log:
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};
}
}
Avis de l' LogMessage
des appels de méthode de certains autres services de journalisation. J'ai besoin de cette partie de retourner immédiatement, afin de ne pas bloquer le thread appelant.
Mise à jour: Basé sur les commentaires des autres (nous avons confirmé le comportement est #1). Donc, j'ai pris des conseils pour utiliser la Tâche de la bibliothèque et réécrit la boucle comme ceci:
if (request.LogMessage)
foreach (var loggingService in loggingServices)
Task.Factory.StartNew(() => loggingService.LogMessage(request));