C# 信号量与阻塞队列

最近做网络综合性实验做一个即时通讯软件的时候,有这样一个情景:某个客户与另外多个客户端进行聊天,由于新消息到达的不确定性,即不知道来不来和不知道什么时候来。

如果用while true + sleep的话有点太浪费资源了,因为现在就是用一个队列里获取消息对象的,于是想做一个阻塞队列。

码农还是直接贴代码吧:

using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace IMClient
{
    public class BlockingQueue<T> : ConcurrentQueue<T>
    {
        private Semaphore semaphore;

        public BlockingQueue()
        {
            semaphore = new Semaphore(0, Int32.MaxValue);//消息不知道有多少,设个足够大的吧,初始=0
        }

        public T Dequeue()
        {
            T t = default(T);//创建一个类型T的对象
            semaphore.WaitOne();//请求信号量,信号量=0,就会阻塞了
            base.TryDequeue(out t);//然后出队,继承于同步队列,因此不用加锁了
            return t;
        }

        public new T TryDequeue(out T t) 
        {
            throw new Exception("Unsupport Method Exception");//对不起,我想你用上面的Dequeue方法
        }

        public new void Enqueue(T t)
        {
            base.Enqueue(t);//出队
            semaphore.Release();//释放信号量
        }
    }
}


转载于:https://my.oschina.net/erinyes/blog/278387

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值