C# 网络传输消息队列

1. 消息队列概念:

        用于存储网络发送过来的消息,因为接受数据是单独的线程,所以需要把数据存储到队列中,主线程从队列中循环取出数据,根据数据意义执行不同任务。根据后进后出原则,选择Queue数据结构。

 

2.  队列1 : 使用locker 实现。

    //队列 用于存储网络传过来的消息
    public class MessageControl {
	
        private object locker = new object();

        private Queue _msgQueue;

        public MessageControl() {
            this._msgQueue = new Queue();
        }

        public void init() {

        }

        public void addMessage(object message) {
            lock (locker) {
                this._msgQueue.Enqueue(message);
            }
        }

        public bool postMessage(ref object message) {
            lock (locker) {
                if (this._msgQueue.Count <= 0) {
                    return false;
                }
                message = this._msgQueue.Dequeue();
            }
            return true;
        }
    }

3.  队列2 : 使用Mutex实现。

    //队列 用于存储网络传过来的消息
    public class MessageControl {

        private Mutex _msgControlMutex;
        private Queue _msgQueue;


        public MessageControl() {
            this._msgControlMutex = new Mutex();
            this._msgQueue = new Queue();
        }

        public void init() {

        }

        public void addMessage(object message) {
            this._msgControlMutex.WaitOne();
            this._msgQueue.Enqueue(message);

            this._msgControlMutex.ReleaseMutex();
        }

        public bool postMessage(ref object message) {
            this._msgControlMutex.WaitOne();
			if (this._msgQueue.Count <= 0) {
				this._msgControlMutex.ReleaseMutex();
				return false;
			}
			message = this._msgQueue.Dequeue();
            this._msgControlMutex.ReleaseMutex();
            return true;
        }
    }

 

4. 开启一个新线程判断队列中是否有数据, 有则取出 分发到主线程中处理。

        public void createDistributeMsgThread() {
            if (null != _distributeMsgThread) {
                _distributeMsgThread.Abort();
            }

            _distributeMsgThread = new Thread(distributeMsg);
            _distributeMsgThread.Start();
        }

        private void distributeMsg() {
            object msg = null;
            while (true) {
                Thread.Sleep(100); // 阻塞一会 否则CPU 一核跑满
                if (_msgControl.postMessage(ref msg)) {
                    _acDistributeMsg(msg);
                }
            }
        }

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值