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菜鸟站  阅读(21)  评论(0编辑  收藏  举报