首页 > 解决方案 > 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

s AsParallel().ForAll 可靠

该项目是 Net Standard 2.0 上的一个库,在 Net Core 3.1 上进行了测试。任何人都有任何想法可能是什么问题?

标签: c#task-parallel-libraryplinq

解决方案


推荐阅读