c#queue和deque同时

时间:2017-09-08 13:03:56

标签: c# multithreading parallel-processing queue multitasking

我正在开发一个项目,需要读取一个qr代码,对其进行排队,因为它是队列,另一个任务使数据出列并通过套接字消息传递给机器。这都是在c#中完成的。

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

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

任何帮助将不胜感激。

编辑:基于你的评论并进行一些研究,我开始编写一些代码。不管我做了什么,线程只运行一次。它应该继续运行。

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

1 个答案:

答案 0 :(得分:1)

我强烈建议您使用BlockingCollection。您遇到的问题称为Producer-Consumer problem

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

具体来说,您还必须考虑:当出列的线程变慢并且无法跟上扫描线程时会发生什么情况,例如由于当时的网络速度缓慢?

基于BlockingCollectionBlockingCollection Capacity specified while constructing将阻止排队线程使整个过程同步变慢。

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

相关问题