- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我创建了一个实现通用 IQueue 接口(interface)的自定义通用队列,该接口(interface)使用 System.Collections.Generic 命名空间中的通用队列作为私有(private)内部队列。示例已清除不相关的代码。
public interface IQueue<TQueueItem>
{
void Enqueue(TQueueItem queueItem);
TQueueItem Dequeue();
}
public class CustomQueue<TQueueItem> : IQueue<TQueueItem>
{
private readonly Queue<TQueueItem> queue = new Queue<TQueueItem>();
...
public void Enqueue(TQueueItem queueItem)
{
...
queue.Enqueue( queueItem );
...
}
public TQueueItem Dequeue()
{
...
return queue.Dequeue();
...
}
}
我想让事情与核心实现保持一致,并且注意到核心 Queue 实现了 IEnumerable,因此我将通过在类上显式实现 IEnumerable 或使用 IQueue 接口(interface)继承它来做同样的事情。
我想知道的是,在对队列进行枚举时,每个移动的下一步是否应该使下一个项目出列?我已经使用反射器来了解 Microsoft 是如何做到的,他们所做的只是遍历队列私有(private)数组,但 Microsoft 远非万无一失,所以我想得到一个普遍的意见。
public class CustomQueue<TQueueItem> : IQueue<TQueueItem>, IEnumerable<TQueueItem>
{
...
public IEnumerator<TQueueItem> GetEnumerator()
{
while (queue.Count > 0)
{
yield return Dequeue();
}
}
//Or
public IEnumerator<TQueueItem> GetEnumerator()
{
return queue.GetEnumerator();
}
...
}
我有两种想法,一方面我觉得遍历集合不应该改变集合状态,但另一方面,特别是对于我的特定实现,它会使用法看起来很干净。
编辑
把事情放在上下文中。我正在实现的类在出队时执行 Monitor.Wait 并且队列中没有项目。当一个项目被放入队列时,就会有一个 Monitor.Pulse。这允许一个线程将内容推送到队列中,而另一个线程基本上“监视”队列。
从编码的角度来看,我试图决定哪个看起来更干净:
foreach(QueueItem item in queue)
{
DoSomethingWithThe(item);
}
//Or
while(systemIsRunning)
{
DoSomethingWithThe(queue.Dequeue());
}
对于我的特定实现,是否有多个进程出列项目无关紧要。因为它是一个队列,所以他们都可以选择一个项目,因为任何项目都不应被处理超过一次,因此使用队列。
编辑
有趣的是,我发现了一篇博文,其中有人正是这样做的。
编辑
在我关闭它之前最后一次尝试。人们如何看待这个类没有实现 IEnumerable 但有一个 IEnumerator GetEnumerator() 方法来使项目出队? .net 语言支持鸭子类型,foreach 是其中一种用途。也许这值得它自己的问题?
编辑
提出了实现 GetEnumerator 方法而不在另一个中实现 IEnumerable 的问题 question .
最佳答案
迭代器应该始终是幂等的,也就是说,在迭代队列时不要修改它。
不能保证不会有两个并发迭代...
编辑以处理您的新评论:
当另一个程序员(比如你 future 的自己 ;) )过来为代码添加功能时,他们可能不会假设迭代器是一次性的。他们可能会添加一个日志语句,在使用它之前列出队列中的内容(哎呀)。
我刚刚想到的另一件事是,visual studio 调试器会经常枚举您的类以供显示。那会导致一些极其困惑的错误 :)
如果您正在实现 IEnumerable 的子接口(interface),并且不想支持 IEnumerable,则应该抛出 NotSupportedException。虽然这不会给您任何编译时警告,但运行时错误将非常明显,而奇怪的 IEnumerable 实现可能会浪费您以后的时间。
关于c# - Queue 上的 IEnumerable 迭代器是否应该使项目出列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189581/
我试图弄清楚以下模块正在做什么。 import Queue import multiprocessing import threading class BufferedReadQueue(Queue.
如果我使用 Queue.Queue,那么我的 read() 函数不起作用,为什么?但是,如果我使用 multiprocessing.Queue,它运行良好: from multiprocessing
我正在寻找比我在文档中找到的更多关于 Python 队列实现的见解。 根据我的理解,如果我在这方面有误,请原谅我的无知: queue.Queue():通过内存中的基本数组实现,因此不能在多个进程之间共
当我使用多处理模块(Windows 上的 Python 2.7)中的队列代替 Queue.Queue 时,我的程序没有完全关闭。 最终,我想使用 multiprocessing.Process 处理
阅读了大量的 JavaScript 事件循环教程,我看到了不同的术语来标识队列存储消息,当调用堆栈为空时,事件循环准备好获取消息: 队列 消息队列 事件队列 我找不到规范的术语来识别它。 甚至 MDN
我收到错误消息“类型队列不接受参数”。当我将更改队列行替换为 PriorityQueue 时,此错误消失并且编译正常。有什么区别以及如何将其更改为编译队列和常规队列? import java.util
如何将项目返回到 queue.Queue?如果任务失败,这在线程或多处理中很有用,这样任务就不会丢失。 docs for queue.Queue.get()说函数可以“从队列中删除并返回一个项目”,但
如何在多个 queue.Queue 上进行“选择”同时? Golang 有 desired feature及其 channel : select { case i1 = 声明。 线程:queue 模
http://docs.python.org/2/library/queue.html#Queue.Queue.put 这似乎是一个幼稚的问题,但我在文档和谷歌搜索中都没有找到答案,那么这些方法是线程
这可能是个愚蠢的问题,但我对与 .dequeue() 和 $.queue() 一起使用的 .queue() 感到困惑> 或 jquery.queue()。 它们是否相同,如果是,为什么 jquery
我正在尝试创建一个线程化的 tcp 流处理程序类线程和主线程对话,但是 Queue.Queue 也没有做我需要的,服务器从另一个程序接收数据,我只想传递它进入主线程进行处理这里是我到目前为止的代码:
The principal challenge of multi-threaded applications is coordinating threads that share data or ot
在Queue模块的queue类中,有几个方法,分别是qsize、empty 和 full,其文档声称它们“不可靠”。 他们到底有什么不可靠的地方? 我确实注意到 on the Python docs网
我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。 Python 至少有两个队列类,Queue.Queue 和 collections.deque,前者似乎在内部使用后者。两者都在
明天我将介绍我选择进程内消息队列实现的基本原理,但我无法阐明我的推理。我的合作设计者提议我们实现一个简单的异步队列,只使用基本的作业列表和互斥锁来控制访问,我建议在嵌入式模式下使用 ActiveMQ。
在 scala 中定义了一个特征: trait Queue[T] Queue 是一种类型吗?或其他东西,例如类型构造函数? 来自 http://artima.com/pins1ed/type-para
我看到 SML/NJ 包含一个队列结构。我不知道如何使用它。如何使用 SML/NJ 提供的附加库? 最佳答案 Queue structure SML '97 未指定,但它存在于 SML/NJ 的顶级环
我是 D3 和 JavaScript 的新手。 我试图理解其中的 queue.js。 我已经完成了 this关联。但是仍然无法清楚地了解 queue.await() 和 queue.awaitAll(
所以我试图在我的 main.cpp 文件中调用一个函数,但我得到“错误:没有匹配函数来调用‘Queue::Queue()。” 队列.h #ifndef QUEUE_H #define QUEUE_H
假设我有一个 10 行的二维 numpy 数组 例如 array([[ 23425. , 521331.40625], [ 23465. , 521246.03125],
我是一名优秀的程序员,十分优秀!