如何创建项目集合

时间:2017-03-16 15:44:41

标签: c# .net design-patterns

让我试着解释一下我想要实现的设计模式。我有一个Queue<Item>或其他一些需要通过某种方法处理的Item集合

static void Process(Item item) 
{
   // ... 
} 

可以同步或异步处理它们。

此队列将定期添加项目,因为我有一些方法,如

static void AddWorkToQueue()
{
   // ... 
}

在计时器上运行

timer.Elapsed += AddWorkToQueue();

所以我需要的是某种类型&#34;连续while循环&#34;只要队列为空就停止。

如何以最佳方式使用C#.NET执行此操作?是否有任何内置库可以解决此类问题?

2 个答案:

答案 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);
  }
}