Tag: 队列

你如何获得队列中的第一个和最后一个项目?

假设我有一个滚动的值集合,我指定集合的​​大小,每当添加新值时,超出此指定大小的任何旧值都将被删除。 显然(我已经测试了这个)用于此行为的最佳集合类型是队列: myQueue.Enqueue(newValue) If myQueue.Count > specifiedSize Then myQueue.Dequeue() 但是,如果我想计算队列中第一个和最后一个项目之间的差异怎么办? 显然我无法通过索引访问项目。 但是,从队列切换到实现IList的东西看起来有点矫枉过正,编写类似Queue的新类也是如此。 现在我有: Dim firstValue As Integer = myQueue.Peek() Dim lastValue As Integer = myQueue.ToArray()(myQueue.Count – 1) Dim diff As Integer = lastValue – firstValue 对ToArray()这种呼吁困扰着我,但是一个更好的选择并没有找到我。 有什么建议?

如果队列上的IEnumerable迭代器应该使项目出列

我创建了一个自定义通用队列,它实现了一个通用的IQueue接口,该接口使用System.Collections.Generic命名空间中的通用Qu​​eue作为私有内部队列。 示例已清除不相关的代码。 public interface IQueue { void Enqueue(TQueueItem queueItem); TQueueItem Dequeue(); } public class CustomQueue : IQueue { private readonly Queue queue = new Queue(); … public void Enqueue(TQueueItem queueItem) { … queue.Enqueue( queueItem ); … } public TQueueItem Dequeue() { … return queue.Dequeue(); … } } 我希望保持与核心实现的一致性,并注意到核心Queue实现了IEnumerable,所以我将通过在类上显式实现IEnumerable或使用IQueue接口inheritance它来做同样的事情。 我想知道的是,当列举队列时,如果每次移动都会使下一个项目出列? 我已经使用reflection器来了解微软是如何做到的,他们所做的就是逐步完成队列私有arrays,但微软远非绝对不可靠,所以我想获得一般意见。 public class CustomQueue : IQueue, […]

为什么Monitor类保留2个队列:“就绪”和“等待”?

根据MSDN : Monitor类由静态(在C#中)或Shared(在Visual Basic中)方法组成,这些方法对控制对关键部分的访问的对象进行操作。 为每个同步对象维护以下信息: 对当前持有锁的线程的引用。 对就绪队列的引用,其中包含准备获取锁的线程。 对等待队列的引用,其中包含等待通知锁定对象状态更改的线程。 在这个线程中 ,2个队列引起了一些微妙的问题。 我认为上述线程中问题的根本原因是有2个队列。 如果只有一个队列,则每当Monitor.Pulse() ,只能调度该单个队列中的一个线程来运行。 多个线程无法同时处于就绪状态。 所以这个问题永远不会发生。 那么为什么Monitor保留2个队列呢?

执行FloodFill的不同方法

好的,我有几种不同的方法来执行FloodFill。 所有这些都会导致问题。 我将列出3种方法并解释每种方法会发生什么。 如果有人能给我一些很棒的指示。 我见过一些类似的post,但没有一个是C#,java或VB.net(我知道的唯一语言)。 对此的给予是我有一个名为PixelData的类,它将一个Color存储在CellColor成员变量中。 我有一个50×50 PixelData对象的数组,称为“像素”。 我也有一个名为CANVAS_SIZE的常量,在这种情况下为50。 以下是我尝试过的三种方法。 这个是递归的。 它非常容易出现堆栈溢出。 我已经尝试设置一个计时器,在此方法完成后启用CanFill成员。 这仍然不能防止溢出: private void FloodFill(Point node, Color targetColor, Color replaceColor) { //perform bounds checking X if ((node.X >= CANVAS_SIZE) || (node.X = CANVAS_SIZE) || (node.Y < 0)) return; //ouside of bounds //check to see if the node is the target color if (pixels[node.X, […]

线程安全队列 – 入队/出队

首先,我将解释一个简短的场景; 当来自某些设备的信号触发时,会将类型为Alarm的对象添加到队列中。 每隔一段时间检查一次队列,对于队列中的每个Alarm,它会触发一个方法。 但是,我遇到的问题是,如果在遍历队列时将警报添加到队列中,则会在您使用它时发出错误说队列已更改。 这里有一些代码来显示我的队列,只是假设警报不断被插入其中; public class AlarmQueueManager { public ConcurrentQueue alarmQueue = new ConcurrentQueue(); System.Timers.Timer timer; public AlarmQueueManager() { timer = new System.Timers.Timer(1000); timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.Enabled = true; } void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { DeQueueAlarm(); } private void DeQueueAlarm() { try { foreach (Alarm alarm in alarmQueue) { SendAlarm(alarm); alarmQueue.TryDequeue(); //having […]

Bankteller控制台应用程序

我正在制作一个简单的应用程序来模拟银行家的问题 。 我想要模拟的是: 你在商店里有4个柜台。 1柜台开放。 客户开始进入并进入第一个柜台的生产线。 当第四个客户进入第一个柜台的生产线时,应打开另一个柜台。 该线应在两个计数器之间平均分配。当第二个柜台的客户得到帮助而没有新客户进入该线时,计数器应该关闭。 基本上4太多了。 我似乎无法弄明白。 我知道我需要使用队列。 但是怎么样? 有人能在控制台应用程序中给我一个例子吗? 优先C#。 提前致谢。 这是我到目前为止尝试过的, 注册类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RegisterCounter { class Register { private int customerCount; public Queue Line = new Queue(); public Register() { customerCount = 2; } public Register(int customerCount) { this.customerCount = […]

有没有更好的方法为队列实现Remove方法?

首先,只是授予我实际上想要Queue – FIFO的function,通常只需要Enqueue / Dequeue等等 – 所以我更喜欢“你真正想要的”之外的答案是List “(我知道RemoveAt )。 例如,假设我有一个数据点的Queue dataToProcess ,需要按照它们到达的顺序进行处理。 然后定期有一些像这样的代码是有意义的: while (dataToProcess.Count > 0) { DataPoint pointToProcess = dataToProcess.Dequeue(); ProcessDataPoint(pointToProcess); } 但是,无论出于何种原因,我们都会发现, 不应该处理已添加到队列中的特定数据点。 那么如果有一种类似于以下的方法,那将是理想的: dataToProcess.Remove(badPoint); 我理解,实际上没有可行的方法来使用不涉及某种forms的枚举的Remove方法; 但是,由于Queue并不能让你随便进入并随机删除一些项目,我能想到的唯一解决方案是: bool Remove(T item) { bool itemFound = false; // set up a temporary queue to take items out // one by one Queue receivingQueue = […]

具有自动大小限制管理的ThreadSafe FIFO列表

我正在试图找出要使用的数据类型……基本上我想要一个线程安全的FIFO队列,并且一旦达到预先指定的限制就会自动丢弃足够多的项目。 嗯,实际上,也许更多的是列表,因为我不想要推入队列并从队列中弹出一个项目的整个概念,此时它已不再可用。 用例基本上是一个播放列表,我最多可以有5个即将到来的项目,当前正在播放的项目,然后是大约20个已播放的项目。 因此,为什么我猜它不能是一个队列,我将访问中间的一个项目作为“当前”项目。 当列表变得很大时,我宁愿不必手动管理扔掉旧物品……显然我可以自己写这些,但如果C#已经存在,我不想重新发明轮子。 我可以用什么想法?

multithreading.NET队列问题

我的代码中有一个奇怪的错误。 这是非常罕见的(可能每隔几周发生一次),但它在那里,我不知道为什么。 我们有2个线程在运行,1个线程获取网络消息并将它们添加到队列中,如下所示: DataMessages.Enqueue(new DataMessage(client, msg)); 另一个线程将消息从此队列中取出并处理它们,如下所示: while (NetworkingClient.DataMessages.Count > 0) { DataMessage message = NetworkingClient.DataMessages.Dequeue(); switch (message.messageType) { … } } 但是,每隔一段时间我就会在行switch (message.messageType)上得到一个NullReferenceException,我可以在调试器中看到该消息为null。 将空值放入队列是不可能的(参见代码的第一位),这些是使用队列的唯一两件事。 队列是不是线程安全的,是不是我在另一个线程入队的确切时刻出列,这会导致故障?

有没有更好的方法来等待排队的线程?

有没有更好的方法在执行另一个进程之前等待排队的线程? 目前我在做: this.workerLocker = new object(); // Global variable this.RunningWorkers = arrayStrings.Length; // Global variable // Initiate process foreach (string someString in arrayStrings) { ThreadPool.QueueUserWorkItem(this.DoSomething, someString); Thread.Sleep(100); } // Waiting execution for all queued threads lock (this.workerLocker) // Global variable (object) { while (this.RunningWorkers > 0) { Monitor.Wait(this.workerLocker); } } // Do anything else Console.WriteLine(“END”); […]