如何实现我自己的高级生产者/消费者场景?

2023-12-10


NOTE:
我对我的问题进行了彻底的修改。您可以通过更改历史记录查看原始问题。


我需要一个“强大的”队列,它提供以下功能:

  • 我对一组对象有一定的范围。这意味着Group A, Group B, ...将有自己的队列
  • 我正在组范围内的线程中填充队列Thread A(制作人)
  • 我正在读取组范围线程中的队列Thread B(消费者)

所以我会有以下场景:

  1. 队列中现在和将来都不会有项目(因为作业是用空的“目标组”调用的):Thread B应该跳出循环
  2. 目前队列中没有项目,因为Thread A正在处理要排队的项目:Thread B应该等待
  3. 队列中有项目:Thread B应该能够使项目出队并处理
  4. 队列中没有项目,因为Thread A没有更多项目要排队:Thread B应该跳出循环

现在我想出了以下实现:

public class MightyQueue<T>
  where T : class
{
    private readonly Queue<T> _queue = new Queue<T>();

    private bool? _runable;
    private volatile bool _completed;

    public bool Runable
    {
        get
        {
            while (!this._runable.HasValue)
            {
                Thread.Sleep(100);
            }
            return this._runable ?? false;
        }
        set
        {
            this._runable = value;
        }
    }

    public void Enqueue(T item)
    {
        if (item == null)
        {
            throw new ArgumentNullException("item");
        }

        this._queue.Enqueue(item);
    }

    public void CompleteAdding()
    {
        this._completed = true;
    }

    public bool TryDequeue(out T item)
    {
        if (!this.Runable)
        {
            item = null;
            return false;
        }
        while (this._queue.Count == 0)
        {
            if (this._completed)
            {
                item = null;
                return false;
            }
            Thread.Sleep(100);
        }
        item = this._queue.Dequeue();
        return true;
    }
}

然后将使用

Producer

if (anythingToWorkOn)
{
    myFooMightyQueueInstance.Runable = false;
}
else
{
    myFooMightyQueueInstance.Runable = true;
    while (condition)
    {
        myFooMightyQueueInstance.Enqueue(item);
    }
    myFooMightyQueueInstance.CompleteAdding();
}

Consumer

if (!myFooMightyQueueInstance.Runable)
{
    return;
}

T item;
while (myFooMightyQueueInstance.TryDequeue(out item))
{
    //work with item
}

但我相信,这种方法是错误的,因为我正在使用一些Thread.Sleep()-那里的东西(不能有一些 waitHandle 或其他东西吗?)...我也不是关于算法本身... 有人可以帮我吗?


如果您有 .Net 4.0,请使用BlockingCollection。它通过以下方式为您处理所有混乱,包括最后一点CompleteAdding method.

如果您有较早的 .Net,请升级(即,我懒得解释如何实现已经为您完成的东西。)

EDIT:我认为你的问题根本不值得线程处理。只需提前创建所有电子邮件,然后睡觉直到指定时间。

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

如何实现我自己的高级生产者/消费者场景? 的相关文章

  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • 每个客户端一个线程与线程服务器的排队线程模型之间的相对优点?

    假设我们正在构建一个线程服务器 旨在在具有四个核心的系统上运行 我能想到的两种线程管理方案是每个客户端连接一个线程和一个排队系统 正如第一个系统的名称所暗示的那样 我们将为每个连接到服务器的客户端生成一个线程 假设一个线程始终专用于程序的主
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其

随机推荐

  • 将二维数组传递给常量参数的函数

    我从中学到了C 底漆 如果你想保护数组不被函数意外修改 你应该添加const函数定义头中指针声明之前的修饰符 遵循这个明智的建议 在下面的最小示例中 我尝试传递一个非常量二维数组array到函数Sum2D 其中一个参数是pointer to
  • 如何在 JTable 中创建翻转效果?

    在我的应用程序中 我想使用 JTable 的行创建翻转效果 例如 当鼠标进入该行时 该行的背景颜色会发生变化 反之 当鼠标退出该行时 该行的颜色将恢复正常 我怎样才能做到这一点 使用下面的代码 它将让您了解如何对 JTable 的行应用翻转
  • TabWidget 之间的分隔线

    TabWidget下的android divider属性是否有效 我尝试了 android 的选项卡布局教程只是为了测试 http developer android com resources tutorials views hello
  • JavaScript 中按字符串属性值对对象数组进行分组?

    我讨厌这个对象数组 每个对象都有一个日期 我希望能够将这些对象分组为月份 有没有办法转换这个 var data date 2016 08 13 date 2016 07 23 date 2016 08 11 date 2016 08 10
  • 指定的演员阵容无效#3

    我遇到这个问题 我收到 指定的转换无效 Visual Studio 内的错误列表中没有错误 这个错误可能来自我的 Access 数据库吗 private void Submit Click object sender EventArgs e
  • Ruby on Rails 4、Devise 和配置文件页面

    我是编码新手 所以这可能是一个简单的问题 我大约一个月前开始使用 RoR 不幸的是 我遇到了坎坷 似乎无法克服 我尝试过查看其他 SO 问题来寻求帮助 但我仍然是新手 所以编码建议对我来说仍然有点陌生 我希望有人能用更适合新手的术语来表述
  • Android:从重定向到另一个 url 的 url 连接 (graph.facebook.com) 获取位图

    我已经做了一切来获取一个 url 在那里我可以获取 Facebook 用户的个人资料图片 现在剩下的唯一问题是将该图像放入位图对象中 Since http graph facebook com现在首先将连接重定向 正如我们在网址中看到的 h
  • 了解/控制 MLT 融化幻灯片?

    考虑以下bash脚本 在 Ubuntu 18 04 melt 6 6 0 上 它使用melt制作幻灯片并在窗口中本地播放 SDL 使用者 大部分复制自https mltframework org blog making nice slide
  • 如何从 webpack 构建中删除 eval 和 Function 构造函数以避免 CSP 问题

    问题在于 Webpack 在编译代码中使用 eval 因此 Chrome 扩展程序和 Firefox 插件无法工作 因为它需要 CSP 属性中的 unsafe eval 指令 而这是不允许的 我使用 Vue js 作为前端webpack a
  • 将整数转换为字符串时出现问题

    我正在尝试将 EditText 字段中的两个数字相加 到目前为止 我有下面的代码 我相信它将 EditText 字段 pos1 deg 和 pos2 deg 转换为整数 deg1 和 deg2 deg1 Integer parseInt p
  • 如何在 axios 中设置 POST - multipart/form-data 的 MIME 类型?

    我需要使用 MIME 发送 POST 请求 multipart form data 这是我的 POST 标头的默认配置 axios defaults headers post Content Type multipart form data
  • 如何在从另一个表中提取数据的同时创建带有约束的表

    我正在尝试创建一个作家表 其中包含作者 ID 姓氏 名字 ISBN 以及每位作者所写书籍的书名 虽然使用与作者和书籍表相同的数据类型 但不复制这些表中的数据 并将作者 ID 作为主键 标题不为空 ISBN 作为引用 books 表中 ISB
  • Rmarkdown、Rstudio:pandoc.exe:从 TeX 源生成 PDF 时出错

    我正在尝试使用 RStudio 中的 knit pdf 按钮渲染 pdf 文档 但我不断收到此错误 pdfTeX error font expansion auto expansion is only possible with scala
  • 如何在 Django 的 ModelForm 中使用请求

    我想创建一个查询集 其中当前用户用作 ModelForm 中的过滤器 class BookSubmitForm ModelForm book forms ModelChoiceField queryset Book objects filt
  • 我可以假设 Object.keys 的响应顺序相同吗?

    book 1 order 2 deliver 3 在我的应用程序的用户界面中 当我单击 book 时 我从地图上知道要转到哪个步骤 有时我只想通过增加数字来进入下一步 但确保 URL 也发生变化 如何进行从步骤到键的反向映射 我遇到了 EC
  • 如何在使用 PayPal Rest API 执行付款之前更改运费金额

    我尝试将基于 PayPal 经典 API 的旧快速结账流程迁移到新的 RestAPI 但在新流程中出现了一个问题 如何在创建付款后和使用 PayPal RestAPI 执行付款之前更改运费金额 创建付款后请求 intent sale pay
  • CreateMany,其中只有 1 个元素包含特定值

    这似乎是我读过的每篇博客文章或文档中都缺少的东西 我怎么能够CreateMany
  • 找不到可安装的 ISAM

    我正在尝试使用 C 在 net 中创建程序来上传 excel 文件 读取它并将记录 excel 文件从 excel 数据添加到 sql server 数据库 这样做时我遇到错误 找不到可安装的 ISAM 有人可以帮我解决这个问题吗 或者可以
  • 如何预测Google文本转语音的失败?

    在 Android 上 当使用使用 Google 文本转语音引擎的 TextToSpeech 实例时 isLanguageAvailable 方法似乎不可靠 我这样说是因为在很多情况下 此方法将返回 成功 0 1 或 2 但后续的 talk
  • 如何实现我自己的高级生产者/消费者场景?

    NOTE 我对我的问题进行了彻底的修改 您可以通过更改历史记录查看原始问题 我需要一个 强大的 队列 它提供以下功能 我对一组对象有一定的范围 这意味着Group A Group B 将有自己的队列 我正在组范围内的线程中填充队列Threa