.NET6 中具有优先级队列的 Parallel.ForEach

2024-04-18

我正在尝试奔跑Parallel.ForEach on my Priority Queue但我收到以下错误:

严重性代码 说明 项目文件行抑制状态 错误 CS0411 无法从用法推断方法“Parallel.ForEach(OrderablePartitioner, ParallelOptions, Action)”的类型参数。尝试显式指定类型参数。 TPL_POC.PL

我知道如何执行Parallel.ForEach with IEnumerable and List但以下内容没有运气。

private void ProcessTasksParallely()
{
    PriorityQueue<string, int> activeTasksPriority = new PriorityQueue<string, int>();
    foreach (var task in this.tasks)
    {
        activeTasksPriority.Enqueue(task.Task, task.Id);
    }
    Console.WriteLine("Processing");

    var options = new ParallelOptions { MaxDegreeOfParallelism = (Environment.ProcessorCount / 2) * 10 };

    Parallel.ForEach(activeTasksPriority.TryDequeue(out string t, out int priority),
        options,
        (t, priority) =>
        {
            Console.WriteLine($" task {priority}, task = {t}, thread = {Thread.CurrentThread.ManagedThreadId}");
            Thread.Sleep(100);
        });
}

我正在尝试这样做,因为我需要并行处理任务,但要根据它们安排的优先级。


The PriorityQueue<TElement, TPriority> https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.priorityqueue-2类没有提供将其用作IEnumerable盒子外面。它只有一个UnorderedItems https://learn.microsoft.com/en-us/dotnet/api/system.collections.generic.priorityqueue-2.unordereditems财产,这不是你想要的。此属性产生队列的内容而不消耗它们,并且不按特定顺序。虽然实现自定义很容易GetConsumingEnumerable方法为PriorityQueue<TElement, TPriority>类,像这样:

/// <summary>
/// Gets an enumerable sequence that consumes the elements of the queue
/// in an ordered manner.
/// </summary>
public static IEnumerable<(TElement Element, TPriority Priority)>
    GetConsumingEnumerable<TElement, TPriority>(
    this PriorityQueue<TElement, TPriority> source)
{
    while (source.TryDequeue(out TElement element, out TPriority priority))
    {
        yield return (element, priority);
    }
}

使用示例:

var partitioner = Partitioner.Create(activeTasksPriority.GetConsumingEnumerable(),
    EnumerablePartitionerOptions.NoBuffering);

Parallel.ForEach(partitioner, options, entry =>
{
    var (t, priority) = entry;
    Console.WriteLine($"Priority: {priority}, Task: {t}");
    Thread.Sleep(100);
});

的意图Partitioner.Create https://learn.microsoft.com/en-us/dotnet/api/system.collections.concurrent.partitioner.create+NoBuffering https://learn.microsoft.com/en-us/dotnet/api/system.collections.concurrent.enumerablepartitioneroptions是为了防止Parallel.ForEach在准备好处理元素之前提前消耗元素并将它们存储到缓冲区中。

Note:这个答案涉及问题中提出的简单场景,其中PriorityQueue<E,P>在开始并行循环之前已完全填充。如果您想在循环运行时在队列中添加更多项目,则不能直接使用PriorityQueue<E,P>有两个原因:

  1. 它不是线程安全的集合。
  2. 它没有阻塞功能,因此循环可能会在处理所有项目之前提前完成。

如果你正在处理这样的场景,你可以看看这个问题:并发优先收集 https://stackoverflow.com/questions/23470196/concurrent-collection-with-priority.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET6 中具有优先级队列的 Parallel.ForEach 的相关文章

随机推荐

  • java中的绿色线程和本机线程[重复]

    这个问题在这里已经有答案了 绿色线程和本机线程有什么区别 为什么叫绿色 本土呢 我是编程世界的新手 我喜欢学习java 在浏览 java 线程面试问题时 我发现了这一点 我听说过线程 但没有听说过这些绿色和原生的 我仔细研究了绿色线程和本机
  • stripe 登录 zsh:未找到命令:stripe

    我正在跟进条纹文档 https stripe com docs stripe cli install当我去stripe login在步骤 2 中 我收到以下错误 zsh 找不到命令 条带 我已经执行了步骤 1 安装 stripe CLI 为
  • WPF:如何让单选按钮显示为水平行的切换按钮

    我目前正在构建一个将在触摸面板中使用的用户界面 因此 我想将任何单选按钮组显示为切换按钮的水平行 我已经弄清楚如何显示 ToggleButtons 而不是标准项目符号项目
  • 禁用缓存 YouTube 视频

    当 YouTube 使 YouTube 视频与缓存一起使用时 YouTube 取得了相当大的成就 然而 这导致我的 ajax 网站出现问题 我想知道是否有办法禁用 YouTube 视频的缓存 特别是在 Internet Explorer 中
  • 解码 PKCS#12 文件

    我正在寻找在 NET 中解码 PKCS 12 文件的方法 我需要提取私钥和任何证书 以便我可以以编程方式访问以下内容 modulus 公共指数 私人指数 prime1 prime2 指数1 指数2 系数 我需要此信息 以便我可以成功使用 P
  • 从 Facelets 错误页面引用 CDI 托管 bean

    我很难尝试让通用错误页面在使用 JSF 2 Facelets 和 CDI 的 非常简单的 WAR 项目中工作 我的应用程序服务器是 WebLogic 12c 它应该支持所有这些开箱即用的功能 但它无法显示错误页面 当我将完全相同的 WAR
  • 监控 AppFabric 缓存

    我在 3 台服务器 AppFabric 1 1 上设置了高度可用的 AppFabric 缓存 我想监视每台服务器上的本地缓存 如果它因任何原因而关闭 则将其启动备份 Problem 问题是权限 我编写了一个 Powershell 脚本来执行
  • 从 php 中的日期时间获取年/月/日?

    I used date w timestamp and date w timestamp 要知道这一天 date n timestamp 几个月等 现在我正在使用日期时间 我想知道从日期时间获取一天 一个月等的等效函数是什么 PS 我知道我
  • ServiceBus RetryExponential 属性含义

    我很难理解与 QueueClients 结合使用的 RetryExponential 类 我也假设 SubscriptionClients 属性已列出here http msdn microsoft com en us library wi
  • Grails:当我向 message.properties 添加新属性时出现 Native2ascii 错误

    当我在运行时向 grails 应用程序中的 message properties 文件添加新属性时 出现了一个奇怪的错误 当我通过命令行重新启动应用程序或重新启动STS时 此错误消失 我使用的是 2 0 1 版本 直到一周前 我还能够在运行
  • 向 WooCommerce 单一产品页面添加多个选项卡

    我正在尝试向 WooCommerce 添加三个自定义选项卡 我有下面的代码 其中两个显示 但由于某种原因 属性描述选项卡没有显示在页面上 不仅 数量定价 选项卡不显示其描述 我尝试将代码的不同部分移动到不同的位置 并且检查了代码是否有错误或
  • 如何使用 ggplot 显示多个显示分布的箱线图

    我正在尝试获取这样的图表来显示每个年龄组的箱线图分布 But instead my plot looks like this 如何显示箱线图而不是点 为什么我的 Y 轴不是数字 My data looks like this 这是我正在尝试
  • DPI 意识真的需要吗?

    我正在学习如何使用 GDI GDI 绘制 GUI 我发现了这个http msdn microsoft com en us library windows desktop dd756596 v vs 85 aspx step 2 declar
  • 如何删除系统命名空间中的 kubernetes pod(和其他资源)

    我错误地在系统命名空间 kube system 中添加了一个 pod 然后我无法删除这个 Pod 它似乎还创建了一个副本集 每次删除这些项目时 都会重新创建它们 似乎找不到删除属于系统命名空间 kube system 的 Pod 或副本集的
  • 连接关闭且应用程序终止后,BLE 堆栈反复重新连接到外设

    我有一个应用程序 它打开与 BLE 设备的短暂连接 执行一些特征读取和写入 然后断开并关闭连接 应用程序使用 autoReconnect false 并且设备未配对或绑定 我看到 Android 的一些非常奇怪的行为 它似乎反复且意外地重新
  • 从用户控件内部将选项卡添加到选项卡控件

    如何从选项卡本身包含的另一个用户控件将选项卡添加到一个用户控件中存在的选项卡控件 我可以在不将 tabcontrol 作为构造函数中的参数传递的情况下 也许通过某种静态全局方法 来完成此操作吗 我试过了 public static Obse
  • Android的ARGB_8888位图内部格式总是RGBA吗?

    我正在尝试创建一个Bitmap在 Android 中使用Bitmap Config ARGB 8888在我从外部源收到字节后 据我所知 在 a 中设置原始字节的最快方法Bitmap 不使用JNI 是通过使用copyPixelsFromBuf
  • 无法使用 Java 删除文件夹

    我试图删除一个只有文件但没有子文件夹的文件夹 但没有成功 Code File rowFolder new File folderPath String files rowFolder list for String file files F
  • pkg-config 无法在 ffmpeg 构建上找到库(linux)

    我正在尝试在 ubuntu 上为 android 构建 ffmpeg I ve cross compiled all the dependencies I need for my configuration I ve set up the
  • .NET6 中具有优先级队列的 Parallel.ForEach

    我正在尝试奔跑Parallel ForEach on my Priority Queue但我收到以下错误 严重性代码 说明 项目文件行抑制状态 错误 CS0411 无法从用法推断方法 Parallel ForEach OrderablePa