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);
}
}
}