gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:38:22 25 4
gpt4 key购买 nike


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


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

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

所以我会有以下场景:

  1. 队列中现在和将来都没有项目(因为作业是用一个空的“目标组”调用的):线程 B 应该退出循环
  2. 当前队列中没有项目,因为线程 A 正在处理要入队的项目:线程 B 应该等待
  3. 队列中有项目:线程 B 应该能够出列并处理该项目
  4. 队列中没有项目,因为线程 A 没有更多项目要入队:线程 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;
}
}

然后将被使用

制作人

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

消费者

if (!myFooMightyQueueInstance.Runable)
{
return;
}

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

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

最佳答案

如果您有 .Net 4.0,请使用 BlockingCollection .它通过 CompleteAdding 为您处理所有困惑情况,包括最后一点。方法。

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

编辑: 我认为您的问题根本不需要线程。只需提前创建好所有电子邮件,然后在指定时间 sleep 即可。

关于c# - 如何实现我自己的高级生产者/消费者场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4143334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com