/// <summary> /// 添加消息/数据到队列中 /// </summary> /// <param name="sender">消息发出者</param> /// <param name="e">消息参数</param> public void AddMsg(object sender, object e) { //if (GlobalUnit.g_CUS.DnbData.CheckState == Cus_CheckStaute.停止检定) // return; try { CLDC_DataCore.Struct.StVerifyMsg _Msg = new CLDC_DataCore.Struct.StVerifyMsg(); _Msg.objSender = sender; //移除已经过期的消息 while (lstMsg.Count > MaxItem) { CLDC_DataCore.Struct.StVerifyMsg m = lstMsg.Dequeue(); //Console.WriteLine("move one message"); } if (IsMsg) { _Msg.objEventArgs = (EventArgs)e; //进度消息不重复添加 if (e is CLDC_Comm.MessageArgs.EventProcessArgs) { ClearCache(); } else if (e is CLDC_Comm.MessageArgs.EventMessageArgs) { //清空队列 if (((CLDC_Comm.MessageArgs.EventMessageArgs)e).MessageType == Cus_MessageType.清空消息队列) { ClearCache(); return; } else if (((CLDC_Comm.MessageArgs.EventMessageArgs)e).MessageType == Cus_MessageType.提示消息) { //线程消息过虑 if (((CLDC_Comm.MessageArgs.EventMessageArgs)e).Message.IndexOf("线程") != -1 || ((CLDC_Comm.MessageArgs.EventMessageArgs)e).Message.IndexOf("Thread was") != -1) { return; } } } } else { _Msg.cmdData = (CLDC_CTNProtocol.CTNPCommand)e; } lstMsg.Enqueue(_Msg); } catch (Exception ex) { if (!(ex is ThreadAbortException)) { string logPath = "/Log/Thread/MsgThread-" + DateTime.Now.ToString("yyyy-MM-dd") + ".log"; CLDC_DataCore.Const.GlobalUnit.Log.WriteLog(logPath, this, "AddMsg", ex.Message + "\r\n" + ex.StackTrace); } #if DEBUG throw ex; #endif } }
/// <summary> /// 消息处理线程,确保只有一个线程调用 /// </summary> public void DoWork() { while (true) { if (CLDC_DataCore.Const.GlobalUnit.ApplicationIsOver) { break; } if (lstMsg.Count > 0) { try { CLDC_DataCore.Struct.StVerifyMsg _Msg = lstMsg.Dequeue(); if (ShowMsg != null) { if (IsMsg) { //消息队列处理 ShowMsg(_Msg.objSender, _Msg.objEventArgs); } else { //数据队列处理 ShowMsg(_Msg.objSender, _Msg.cmdData); } } } catch (InvalidOperationException e) { e.ToString(); //消息队列为空时的意外处理. } catch (Exception ex) { string logPath = "/Log/Thread/MsgThread-" + DateTime.Now.ToString("yyyy-MM-dd") + ".log"; CLDC_DataCore.Const.GlobalUnit.Log.WriteLog(logPath, this, "DoWork", ex.Message + "\r\n" + ex.StackTrace); #if DEBUG //throw ex; #endif } } Thread.Sleep(SleepTime); } // Console.WriteLine("消息线程已经退出"); string logThreadPath = "/Log/Thread/MsgThreadInfo.log"; CLDC_DataCore.Const.GlobalUnit.Log.WriteLog(logThreadPath, this, "DoWork", Thread.CurrentThread.Name + "退出"); }