c# - Parallel.ForEach 和 AsParallel().ForAll(冻结)
问题描述
下午好,亲爱的论坛用户!我经常使用 PLINQ,直到现在都没有遇到过问题。我正在编写一个通用记录器以在多个项目中使用,这些项目可以以多种方式(文件、邮件、数据库、http 请求)和每种方法的多个来源同时写入日志。因此,我需要使用并发和锁来写入文件。在测试中发现我的代码在使用 AsParallel.ForAll 时会冻结,并且对于 Parallel.ForEach 工作得很好。
调用代码如下所示:
var loggers = new List<ILogger>() { logger1, logger2, logger3, logger4, logger5, logger6 };
var message = "Hello world";
Parallel.For(0, 10000, e =>
{
loggers.AsParallel().ForAll(e =>
{
e.Write(message);
});
});
这段代码似乎工作正常。然而,下面的部分是 Write () 调用的实现仅适用于 Parallel.ForEach。此代码工作正常:
public void Write(string message)
{
Task.Run( () =>
{
Parallel.ForEach(activeLoggers, log =>
{
log.Write(message);
});
});
}
此代码冻结,根本没有到达 Write() 方法:
public void Write(string message)
{
Task.Run( () =>
{
activeLoggers.AsParallel().ForAll(e =>
{
e.Write(message);
});
});
}
在这种情况下,activeLoggers 是一个普通的记录器列表,每个记录器都有自己的记录源。举例说明它们的实现可能没有意义,因为程序会冻结,直到在第二种情况下调用它。我想在Asp Net Core 3.1中使用一个程序,在调用方法logger1、logger2等位于不同的控制器,但可以访问相同的源(例如,文件)。我在以下主题中寻找问题的解决方案,但不幸的是我找不到:
AsParallel.ForAll 与 Parallel.ForEach
.NET 中的并行性——第 8 部分,PLINQ 的 ForAll 方法
Parallel.ForEach 与 AsParallel().ForAll
该项目是 Net Standard 2.0 上的一个库,在 Net Core 3.1 上进行了测试。任何人都有任何想法可能是什么问题?
解决方案
推荐阅读
- security - 使用 Burpsuite 修改请求被认为是有效的安全漏洞?
- excel - 将下拉选择链接到切片器
- java - 获取两个arrayList之间的差异,但以大写形式比较它们
- unreal-engine4 - Unreal Engine 4.20 build error in plugin: [Adaptive unity build] Disabling PCH for exclude files
- html - 包装器 div 旁边的空白
- scala - 如何在 Spark2 中对具有数百万条记录(每日增量加载)的文件生成序列
- java - 如何从 JAX-RS 获取 JSON 响应的具体值?
- postgresql - 无效的大对象描述符:0 hibernate 和 postgres
- go - Golang 什么时候调用 netpoll()
- java - Java创建带有样式的Excel