让我试着解释一下我想要实现的设计模式。我有一个Queue<Item>
或其他一些需要通过某种方法处理的Item
集合
static void Process(Item item)
{
// ...
}
可以同步或异步处理它们。
此队列将定期添加项目,因为我有一些方法,如
static void AddWorkToQueue()
{
// ...
}
在计时器上运行
timer.Elapsed += AddWorkToQueue();
所以我需要的是某种类型&#34;连续while
循环&#34;只要队列为空就停止。
如何以最佳方式使用C#.NET执行此操作?是否有任何内置库可以解决此类问题?
答案 0 :(得分:2)
您可以创建自定义队列类并更改其侦听器:
public class CustomQueue : Queue<object>
{
public event EventHandler FirstItemInserted;
protected virtual void OnFirstItemInserted()
{
FirstItemInserted?.Invoke(this, EventArgs.Empty);
}
//Modified Enqueue method.
public new void Enqueue(object obj)
{
//Call the listener every time an item is inserted into the empty queue.
if (Count == 0)
{
base.Enqueue(obj);
OnFirstItemInserted();
}
else
base.Enqueue(obj);
}
}
&#34; Enqueue&#34;在每次第一次插入后,方法被更改为调用侦听器。 您需要做的就是调用方法来使用队列中的每个项目,只要有要出列的项目。
class MyProgram
{
private static CustomQueue MyQueue;
public MyProgram()
{
MyQueue = new CustomQueue();
MyQueue.FirstItemInserted += ConsumeQueue;
//Activate timer...
}
private static void ConsumeQueue(object sender, EventArgs e)
{
object item;
while (MyQueue.Count > 0)
{
item = MyQueue.Dequeue();
//Do something...
}
}
}
答案 1 :(得分:0)
您可以使用TPL DataFlow中的BufferBlock<Item>
(https://msdn.microsoft.com/en-us/library/hh160414(v=vs.110).aspx):
using System.Threading.Tasks.Dataflow;
static void AddWorkToQueue()
{
queue.Send(new Item());
}
static async void MainLoop()
{
while (true) // may be you need some cancellation token to trigger end of processing
{
var item = await queue.ReceiveAsync();
ProcessItem(item);
}
}