BlockingCollection的基础使用
BlockingCollection就是一个线程安全的阻塞队列,利用阻塞这个特性,我们可以实现进程内的生产者-消费者模式,比如消息转发、日志记录等。
using System;
using System.Collections.Concurrent;
using System.Threading;
public class Program
{
static BlockingCollection<int> queue = new BlockingCollection<int>(boundedCapacity: 5);
static void Producer()
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine($"生产者:生产消息 {i}");
queue.Add(i);
Thread.Sleep(100); // 模拟生产过程
}
queue.CompleteAdding();
}
static void Consumer()
{
foreach (var item in queue.GetConsumingEnumerable())
{
Console.WriteLine($"消费者:消费消息 {item}");
Thread.Sleep(200); // 模拟消费过程
}
}
static void Main()
{
var producerThread = new Thread(Producer);
var consumerThread = new Thread(Consumer);
producerThread.Start();
consumerThread.Start();
producerThread.Join();
consumerThread.Join();
Console.WriteLine("程序执行完毕。");
}
}
using System.Collections.Generic;
using System.Threading;
public class CustomBlockingQueue<T>
{
private Queue<T> queue = new Queue<T>();
private object lockObj = new object();
public void Enqueue(T item)
{
lock (lockObj)
{
queue.Enqueue(item);
Monitor.Pulse(lockObj); // 唤醒等待的线程
}
}
public T Dequeue()
{
lock (lockObj)
{
while (queue.Count == 0)
Monitor.Wait(lockObj); // 等待直到队列非空
return queue.Dequeue();
}
}
}
public class Program
{
static CustomBlockingQueue<int> queue = new CustomBlockingQueue<int>();
static void Producer()
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine($"生产者:生产消息 {i}");
queue.Enqueue(i);
Thread.Sleep(100); // 模拟生产过程
}
}
static void Consumer()
{
for (int i = 1; i <= 10; i++)
{
var item = queue.Dequeue();
Console.WriteLine($"消费者:消费消息 {item}");
Thread.Sleep(200); // 模拟消费过程
}
}
static void Main()
{
var producerThread = new Thread(Producer);
var consumerThread = new Thread(Consumer);
producerThread.Start();
consumerThread.Start();
producerThread.Join();
consumerThread.Join();
Console.WriteLine("程序执行完毕。");
}
}
参考文献:https://www.jb51.net/article/276666.htm、
https://blog.csdn.net/weixin_48588665/article/details/132124842
https://www.cnblogs.com/Insist-Y/p/17407413.html