c# - 我如何创建一个项目集合

标签 c# .net design-patterns

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

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

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

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

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

在计时器上运行

timer.Elapsed += AddWorkToQueue();

所以我需要的是某种类型的“连续 while 循环”,只要队列为空,它就会停止。

如何使用 C#.NET 以最佳方式实现此目的?是否有任何内置库可以解决此类问题?

最佳答案

您可以创建自定义队列类并更改其监听器:

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

“Enqueue”方法已更改为在每次首次插入后调用监听器。 您所需要做的就是调用一个方法来消耗队列中的每个项目(只要有项目需要出列)。

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...
        }
    }
}

关于c# - 我如何创建一个项目集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42838729/

相关文章:

c# - 将同一实体映射到不同的表

c# - .Net DownloadFileTaskAsync 健壮的 WPF 代码

c# - 我如何知道哪个程序集包含给定的命名空间? - C#

android - 我从 SQLiteOpenHelper 派生的类越来越大

c# - 使用 CancellationToken 的异步/等待不会取消操作

.net - 是否可以在客户端凭证流程中为应用程序注册赋予角色?

c# - 无法插入数据库 asp.net C#

asp.net-mvc - 这称为什么类型的架构?

c++ - 分离类所有权和使用,生成最佳(快速)代码

c# - 带有不同过滤器的 Entity Framework 6 查询