在 C# 中异步处理项目队列

2024-01-09

我正在尝试创建一个处理工作队列的系统。该系统具有以下规格:

  1. 该系统有两个组件:工作分配器和工作人员。
  2. 同时运行的worker数量有一个设定的上限。该上限大于一。
  3. 为了避免同一任务被执行两次的问题,只有一个工作分配者。

您会使用什么设计来创建这样的系统?这是我的想法:

  1. 创建队列集合,每个工作人员一个队列
  2. 为工作分配者创建一个计时器。它的工作是填充队列。
  3. 为每个worker创建一个Timer,传入一个队列对象作为对象状态来表示其工作负载
  4. 在队列锁定时将其删除并添加到队列中。
  5. 使用锁定时递增和递减的计数器,以确保同时运行的工作任务数量不超过指定数量。

我觉得必须有更好的方法来做到这一点。你会推荐什么?我应该为工作人员从计时器切换到线程吗?当队列为空时,线程是否应该旋转/等待?线程是否应该关闭并让工作分配者有条件地创建一个新线程?


我不知道你的任务将运行多长时间,但似乎最好的办法是使用ThreadPool。 此外,我只会使用并且实际上已经使用了一个中央队列——仅此一项就可以消除一些复杂性。 我有一个线程处理队列并对项目执行操作(在您的情况下,它将对任务进行排队)。

至于使队列线程安全,System.Collections.Concurrent 中有一个 ConcurrentQueue 用于此目的(msdn http://msdn.microsoft.com/en-us/library/dd267265.aspx, 基准测试与锁定队列 http://geekswithblogs.net/BlackRabbitCoder/archive/2010/06/07/c-system.collections.concurrent.concurrentqueue-vs.-queue.aspx).

现在,放入一个 BlockingCollection (msdn http://msdn.microsoft.com/en-us/library/dd997371.aspx)并且您拥有所需的一切。

        BlockingCollection<Packet> sendQueue = new BlockingCollection<Packet>(new ConcurrentQueue<Packet>());
        while (true)
        {
            var packet = sendQueue.Take(); //this blocks if there are no items in the queue.
            ThreadPool.QueueUserWorkItem(state =>
            {
               var data = (Packet)state;
               //do whatever you have to do
            }, packet );
        }

某处有一些东西sendQueue.Add(packet);

总结,

  1. 所有“工人”的一个队列
  2. 一个线程从队列中出队 并将其传递给线程池。

我想就是这样。

ps:如果你必须控制线程数量,请按照josh3736的建议使用“智能线程池”

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

在 C# 中异步处理项目队列 的相关文章

随机推荐

  • Flume的Spool Dir可以在远程机器上吗?

    每当新文件到达特定文件夹时 我就尝试将文件从远程计算机获取到我的 hdfs 我在flume中遇到了spool dir的概念 如果spool dir位于运行flume代理的同一台机器上 那么它工作得很好 有什么方法可以在远程计算机中配置假脱机
  • ORA-01830-插入日期和时间[重复]

    这个问题在这里已经有答案了 我有以下字符串值 15 01 2023 18 03 42 我尝试将其插入到 Oracle 中的日期列中 然而 这会产生可怕的 ORA 01830 错误 insert into my schema my table
  • MKAnnotation Swift

    我不确定如何用 swift 语言注释地图 我不知道如何创建 NSObject 类 以下是我尝试过但无法运行的代码 import Foundation import MapKit class MapPin MKAnnotation var m
  • 如何平滑 MATLAB 中的绘图?

    我在图表上绘制了大约 9000 个点 全分辨率 https i stack imgur com VeIP5 jpg 其实剧情并没有我想象的那么顺利 有什么方法可以将图表平滑到所需的程度吗 或者某种形式的阈值处理 以便我可以有选择地平滑太凹凸
  • VBA 参考库

    我是 VBA 新手 一直在为 Office 编写一个小型宏应用程序 我们有大约 80 个用户 他们的电脑设置基本相同 除了少数用户之外 所有用户都可以访问它 我一直在尝试使用 Web 服务引用来自动访问网页 并且我还将 Microsoft
  • 在 Python 中将 2D 图形转换为圆柱体

    At the moment I have a figure that looks like this 由代码生成 import matplotlib pyplot as plt import numpy as np data np rand
  • 无法初始化 OpenGL 渲染器库

    我正在尝试使用 genymotion 打开虚拟 Android 设备 问题是它无法启动 Genymotion 虚拟设备 错误显示无法初始化 OpenGL 渲染器库 我已经检查了 OpenGL 支持 它的版本是 3 0 现在有什么问题吗 无法
  • 来自 Ajax 源的 DataTables 按数据顺序排序并显示格式化日期

    基本上我想将数据从ajax提取到我的列中 但我希望列中的单元格具有data order它们的属性与 ajax 调用的值并使用 moment js 格式化单元格中的数据 我认为这是使其美观且可订购的最佳方式 我找到了 datetime mom
  • 如何订阅改变DependencyProperty? [复制]

    这个问题在这里已经有答案了 可能的重复 监听依赖属性的变化 https stackoverflow com questions 4764916 listen to changes of dependency property 请原谅我的英语
  • 使用 jersey 客户端将 JSON 响应读取为字符串

    我正在使用 jersey 客户端将文件发布到 REST URI 该 URI 以 JSON 形式返回响应 我的要求是将响应读取为字符串 JSON 以下是将数据发布到 Web 服务的代码段 final ClientResponse client
  • C# UTF8 输出保持编码字符完整

    我有一个非常简单的问题 我似乎无法理解 我有一个正确编码的 UTF8 String 我使用 Json NET 解析为 JObject 摆弄一些值并将其写入命令行 保持编码字符完整 除了保持编码字符完整之外 一切都很好 Code var js
  • Ajax 将“Map”对象传递给 Spring MVC 控制器

    Spring MVC 似乎不知道如何将 javascript 地图 映射到 Java 地图对象 在 Web UI 中 例如 foo jsp
  • Selenium 未填写表单上的密码属性

    我有一个非常简单的硒脚本来尝试调试我遇到的问题 我所做的就是填写用户名 然后填写密码 然后检查我输入的密码是否在密码字段中 我这样做的原因是我无法让它进行一般身份验证 当密码正确时始终会出现 密码不正确问题 表单 html
  • ec2:RunInstances 的最低 IAM 策略

    我正在尝试缩小运行预定义机器映像的最小策略范围 该映像基于两个快照 我只想启动 m1 medium 实例类型 在此基础上并在以下方面的帮助下这一页 http docs aws amazon com AWSEC2 latest APIRefe
  • 为 ng-bootstrap modal (NgbModal) 编写单元测试 [Angular 6]

    我在为应用程序中的确认模式编写单元测试时遇到一些问题 这是我想测试的一段代码 confirmModal prompt Are you sure title Confirm Observable
  • 硬盘读取性能问题

    我有一个 C 程序 它从硬盘读取文件并对文件中的数据进行一些处理 我正在使用标准 Win32 API 来读取文件 我的问题是这个程序有时速度非常快 然后突然减慢到之前速度的 1 6 如果我在多次运行中一次又一次地读取相同的文件 那么通常第一
  • Azure Function V3 无法加载文件或程序集“Microsoft.Extensions.DependencyModel,版本=3.1.6.0”

    我们尝试使用 DependencyContext Default RuntimeLibraries 来获取所有项目程序集并将我们想要的类型加载到 ServiceCollection 中 此代码在 asp net core Web 应用程序上
  • 如何在 Unix 中交换文件名?

    有什么方法可以在不使用临时变量的情况下快速完成此操作 有内置函数吗 编辑 谢谢你们的回答 看起来我需要澄清我的问题 但在大多数情况下 你们假设是正确的 有两个文件 并且文件名是相反的 文件 A 的名称为 B name file 文件 B 的
  • 如何从另一个应用程序访问字符串资源

    我有一个应用程序 A 和 B 应用程序 假设我在应用程序 A 中有一个字符串资源 lt string name abc gt ABCDEF lt string gt 如何从 B 中的活动访问 abc 的值 我尝试了以下方法 try Pack
  • 在 C# 中异步处理项目队列

    我正在尝试创建一个处理工作队列的系统 该系统具有以下规格 该系统有两个组件 工作分配器和工作人员 同时运行的worker数量有一个设定的上限 该上限大于一 为了避免同一任务被执行两次的问题 只有一个工作分配者 您会使用什么设计来创建这样的系