c# 同时队列和双端队列

c# queue and deque at the same time

我正在做一个需要读取二维码的项目,将其排队,因为它正在排队,另一个任务使数据出列并通过套接字消息将其发送到机器。这一切都是在 C# 中完成的。

我的问题是如何在另一个任务出列时保持队列。我有二维码工作,我可以排队和出队以及套接字消息传递部分工作。但我不知道如何同时 运行 排队和出队。

我研究了线程,特别是多线程。我比开始阅读之前更加困惑。

任何帮助将不胜感激。

编辑:所以根据你的评论和做一些研究,我开始写一些代码。不管我做了什么,线程只有 运行 一次。它应该保持 运行ning.

    public partial class Form1 : Form
{
    private BlockingCollection<string> _queue = new BlockingCollection<string>(30);
    //private string item = "A";
    //private int count = 0;
    private Thread _th1;
    public Form1()
    {
        InitializeComponent();
        _th1 = new Thread(thread_example);
        _th1.Start();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
    }
    private void thread_example()
    {
        if (_queue.Count > 0)
        {
            _queue.Take();
            Console.WriteLine("Removed 1 Item from queue!");
        }
        else
        {
            Console.WriteLine("Queue Empty!");
        }
        Thread.Sleep(500);
    }
    private void btnProduce_Click(object sender, EventArgs e)
    {
        _queue.Add("test_string");
        Console.WriteLine("Added 1 item to the queue");
    }
}

我强烈建议使用 BlockingCollection. The problem you have is called a Producer-Consumer problem

BlockingCollection 提供了一个处理 Producer-Consumer 问题的实现。

具体来说,您还必须考虑:当出队线程变慢并且跟不上扫描线程时会发生什么,比如由于当时的网络缓慢时间?

根据BlockingCollection Capacity specified while constructing.

BlockingCollection将阻塞排队线程以减慢整个同步过程

此外,通过使用 ConcurrentQueueConcurrentBag 作为底层存储,您可以获得 FIFO 或 LIFO 行为。 BlockingCollection 仅在基础同步集合之上提供 "bounded-ness" 属性。