首页 > 编程语言 >C# ConcurrentQueue与SemaphoreSlim使用

C# ConcurrentQueue与SemaphoreSlim使用

时间:2024-05-15 14:40:45浏览次数:23  
标签:信号量 SemaphoreSlim C# queue Enqueue 线程 ConcurrentQueue

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
}

标签:信号量,SemaphoreSlim,C#,queue,Enqueue,线程,ConcurrentQueue
From: https://www.cnblogs.com/yzlong520/p/18193841

相关文章

  • centos7设置固定IP
            详情见链接Vmware虚拟机Linux配置固定IP地址(详细版)_虚拟机固定ip-CSDN博客 ......
  • 基于UltraScale架构的XCVU3P-3FFVC1517E XCVU3P-2FFVC1517I XCVU3P-1FFVC1517E高性能
    概述VirtexUltraScale+器件是基于14nm/16nmFinFET节点的高性能FPGA,支持3DIC技术和多种计算密集型应用。AMD第三代3DIC使用堆叠硅片互联(SSI)技术打破了摩尔定律的限制,并且实现了最高信号处理和串行I/O带宽,以满足最严格的设计要求。它还提供了一个虚拟的单片设......
  • oracle rac 增加asm盘
    扫描新增设备echo"---">/sys/class/scsi_host/host0/scanecho"---">/sys/class/scsi_host/host1/scanecho"---">/sys/class/scsi_host/host2/scanecho"---">/sys/class/scsi_host/host3/scanecho"-......
  • 后端跨域cookie问题与spring-session-data-redis
    背景1、后端统一接入了公司内部登录系统,登录后cookie信息在域名:test.net.cn下。Set-Cookie:SESSION=09a2f617-66a0-4e02-b99f-130d83900321;Domain=test.net.cn;Path=/;HttpOnly;SameSite=Lax2、当我们的系统接入到统一登录系统后,若访问域名为a.test.net.cn,则不会出现问题,因......
  • Apple Logic Pro 11.0.0 下载 - 配备全新 AI 功能,引领音乐创作再上新阶
    AppleLogicPro11.0.0下载-配备全新AI功能,引领音乐创作再上新阶AppleLogicPro11.0.0-专业音乐制作(音频编辑)LogicPro配备全新AI功能,引领音乐创作再上新阶请访问原文链接:https://sysin.org/blog/apple-logic-pro/,查看最新版。原创作品,转载请保留出处。作者主......
  • VMware Fusion 13.5.2 for Mac 发布,产品订阅模式首个重大变更
    VMwareFusion13.5.2forMac发布,产品订阅模式首个重大变更适用于基于Intel处理器和搭载Apple芯片的Mac的桌面虚拟化软件请访问原文链接:https://sysin.org/blog/vmware-fusion-13/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org好消息是:今天我们可以免费使......
  • C++封装dll(__cdecl和__stdcall)
    【1】使用__stdcall还需要添加def文件编译,使用工具DEPENDS.EXE打开dll文件成功。【2】使用__cdecl直接编译即可,不需要导入def文件......
  • Apple Safari 17.5 - macOS 专属浏览器 (独立安装包下载)
    AppleSafari17.5-macOS专属浏览器(独立安装包下载)适用于macOSVentura和macOSMonterey的Safari浏览器17请访问原文链接:https://sysin.org/blog/apple-safari-17/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org之前Safari浏览器伴随macOS更新一起......
  • socket
    Socket层【一】Scoket层在哪还是用图来说话,一目了然。【二】什么是socketSocket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面对用户来说,一组简单的接口就是全部,让Socket去......
  • python列出centos7内存使用前50的进程信息
    python代码,列出centos7系统内存使用排名前50的进程信息,按照内存使用大小从大到小排序。 importpsutil#获取系统内存信息total_memory=psutil.virtual_memory().total/(1024.0**3)#转换为GBavailable_memory=psutil.virtual_memory().available/......