.NET 函数 Parallel.ForEach 是否会阻塞调用线程?我猜测有以下两种行为:
- 是的,它会阻塞直到最慢执行项返回。
- 不会,它不会阻塞并立即返回控制。要并行运行的项在后台线程上完成。
或者还有其他情况发生,是否有人确定呢?
这个问题出现在我实现一个日志类时:
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};
}
}
注意LogMessage
方法调用了其他日志服务。我需要该部分立即返回,以便不阻塞调用线程。
更新:根据他人的评论(我们已确认行为是#1),因此我采纳了建议使用 Task 库并重写了循环:
if (request.LogMessage)
foreach (var loggingService in loggingServices)
Task.Factory.StartNew(() => loggingService.LogMessage(request));
Task t = Task.TaskFactory.StartNew(() => {/* Parallel.For goes here */});
@PaulFryer 发布的代码是在使用 C# 编程语言中的多线程编程功能。这段代码创建了一个新的任务(Task),并通过任务工厂(TaskFactory)启动该任务,同时将一个 Lambda 表达式作为参数传递给 StartNew 方法。Lambda 表达式中包含需要并行执行的代码,并且可以使用 Parallel.For 方法来实现循环并行化。 - Richard