C# ConcurrentQueue与SemaphoreSlim使用

using System;
using System.Collections.Concurrent;
using System.Threading;

class Program
{
private static ConcurrentQueue _queue = new ConcurrentQueue();
// Environment.ProcessorCount 获取当前计算机处理器数量
private static SemaphoreSlim _semaphore = new SemaphoreSlim(Environment.ProcessorCount);

static void Main(string[] args)
{
for (int i = 0; i < 10; i++) // 模拟10个任务
{
int taskId = i;
Task.Run(async () =>
{
await _semaphore.WaitAsync(); // 等待信号许可
try
{
// 模拟耗时任务
await Task.Delay(1000);
Console.WriteLine($"Task {taskId} is running.");

// 将任务ID添加到队列
_queue.Enqueue(taskId);
}
finally
{
_semaphore.Release(); // 释放信号许可
}
});
}

// 等待所有任务完成
Thread.Sleep(2000);

// 打印队列内容
while (_queue.TryDequeue(out int item))
{
Console.WriteLine($"Dequeued: {item}");
}
}
}

SemaphoreSlim可以用于以下场景:

控制同时访问某个资源的线程数量。
在并发环境中限制对资源的访问,以避免竞争条件和数据损坏。
实现生产者-消费者模式,其中生产者线程在资源可用时将其放入,而消费者线程在资源可用时将其取出。
以下是SemaphoreSlim类的一些常用方法和属性:

Wait(): 当前线程尝试获取信号量,如果信号量计数器大于0,则计数器减1,否则线程将被阻塞直到信号量可用。
WaitAsync(): 异步版本的Wait()方法,可以在异步代码中使用。
Release(): 释放信号量,将计数器加1。
CurrentCount: 获取当前信号量的计数器值。

C# ConcurrentQueue使用
ConcurrentQueue 是 .NET Framework 中的一个线程安全的队列,可以在多线程环境中使用。以下是一些常见的操作和使用示例:
1.入队(Enqueue):将一个或多个元素添加到队列的末尾
ConcurrentQueue queue = new ConcurrentQueue();
queue.Enqueue(1);
queue.Enqueue(2);

2.出队(TryDequeue):尝试移除并返回队列开头的元素。
int result;
if (queue.TryDequeue(out result))
{
Console.WriteLine(result); // 输出: 1
}

posted @ 2024-05-15 14:40  .Net菜鸟站  阅读(240)  评论(0)    收藏  举报