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
将阻塞排队线程以减慢整个同步过程
此外,通过使用 ConcurrentQueue
或 ConcurrentBag
作为底层存储,您可以获得 FIFO 或 LIFO 行为。 BlockingCollection
仅在基础同步集合之上提供 "bounded-ness" 属性。
我正在做一个需要读取二维码的项目,将其排队,因为它正在排队,另一个任务使数据出列并通过套接字消息将其发送到机器。这一切都是在 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
将阻塞排队线程以减慢整个同步过程
此外,通过使用 ConcurrentQueue
或 ConcurrentBag
作为底层存储,您可以获得 FIFO 或 LIFO 行为。 BlockingCollection
仅在基础同步集合之上提供 "bounded-ness" 属性。