我正在开发一个项目,需要读取一个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");
}
}
答案 0 :(得分:1)
我强烈建议您使用BlockingCollection
。您遇到的问题称为Producer-Consumer problem
BlockingCollection
提供了一个处理Producer-Consumer
问题的实现。
具体来说,您还必须考虑:当出列的线程变慢并且无法跟上扫描线程时会发生什么情况,例如由于当时的网络速度缓慢?
基于BlockingCollection
,BlockingCollection Capacity specified while constructing
将阻止排队线程使整个过程同步变慢。
此外,通过使用ConcurrentQueue
或ConcurrentBag
作为底层存储,您可以获得FIFO或LIFO行为。 BlockingCollection
只提供&#34; bounded-ness&#34;基础同步集合之上的属性。