namespace AsiaINFO.SMS.APPCMPP2.MyThread.CMPPThread { using AsiaINFO.SMS.APPCMPP2; using AsiaINFO.SMS.APPCMPP2.MyThread; using AsiaINFO.SMS.CMPP2; using AsiaINFO.SMS.Entity; using System; using System.Collections; using System.Collections.Generic; using System.Threading; using System.IO; public class SubmitRespThread : CMPPThreadBase { private Dictionary _slidingWindowDic; private SyncEvents _slidingWindowEvents; private SyncEvents _submitOKEvents; private Queue _submitOKQueue; private Queue _submitRespQueue; private object _syncSlidingWindowDicObject; private CMPP_SUBMIT_RESP response; private SubmitInfo submit; public SubmitRespThread(CMPPClient cmppClient, SyncEvents syncEvents, object syncSlidingWindowDicObject, Dictionary slidingWindowDic, SyncEvents slidingWindowEvents, Queue submitOKQueue, SyncEvents submitOKEvents, Queue submitRespQueue) : base(cmppClient, syncEvents) { if (((syncSlidingWindowDicObject == null) || (slidingWindowDic == null)) || (((submitOKQueue == null) || (submitOKEvents == null)) || (submitRespQueue == null))) { throw new Exception("SubmitRespThread参数不能为空!"); } this._syncSlidingWindowDicObject = syncSlidingWindowDicObject; this._slidingWindowDic = slidingWindowDic; this._slidingWindowEvents = slidingWindowEvents; this._submitOKQueue = submitOKQueue; this._submitOKEvents = submitOKEvents; this._submitRespQueue = submitRespQueue; } private void DealData(byte[] data) { try { int count = 0; CMPP_SUBMIT_RESP cmpp_submit_resp = new CMPP_SUBMIT_RESP(data); lock (this._syncSlidingWindowDicObject) { this._slidingWindowDic.TryGetValue((ulong) cmpp_submit_resp.Header.Sequence_Id, out this.submit); } if (this.submit != null) { lock (this._syncSlidingWindowDicObject) { OnMsg($"[_slidingWindowDic]移除已经提交的数据------Guid:{submit.MTWait.Guid},号码:{submit.MTWait.MOBILE_NO}",MsgLevel.Debug); this._slidingWindowDic.Remove((ulong) cmpp_submit_resp.Header.Sequence_Id); count = this._slidingWindowDic.Count; } this.submit.Result = cmpp_submit_resp.Result; this.submit.RespMsgID = cmpp_submit_resp.Msg_Id; string msg = string.Format("收到SUBMIT反馈 MsgID={0} State={1},------时间:"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), this.submit.RespMsgID, this.submit.Result); base.OnMsg(msg, MsgLevel.Debug); this._submitOKData = this.submit; this._submitOKEvents.NewItemEvent.Set(); if (count <= 0) { this._slidingWindowEvents.NewItemEvent.Set(); } } } catch (Exception exception) { base.OnMsg("[CMPP_SUBMIT_RESP]异常:" + exception.Message, MsgLevel.Err); } } protected override void Run() { byte[] data = null; while (WaitHandle.WaitAny(base._syncEvents.EventArray) != 1) { Label_0004: data = null; lock (((ICollection) this._submitRespQueue).SyncRoot) { if (this._submitRespQueue.Count > 0) { data = this._submitRespQueue.Dequeue(); } } if (data != null) { this.DealData(data); goto Label_0004; } } base.Stop(); } public override void Stop() { if ((base._thread != null) && (base._thread.ThreadState == ThreadState.Suspended)) { base.StartRun(); } base._syncEvents.ExitThreadEvent.Set(); } private int _submitDicCount { get { lock (this._syncSlidingWindowDicObject) { return this._slidingWindowDic.Count; } } } private SubmitInfo _submitOKData { get { lock (((ICollection) this._submitOKQueue).SyncRoot) { if (this._submitOKQueue.Count > 0) { return this._submitOKQueue.Dequeue(); } } return null; } set { lock (((ICollection) this._submitOKQueue).SyncRoot) { this._submitOKQueue.Enqueue(value); } } } private byte[] _submitRespData { get { lock (((ICollection) this._submitRespQueue).SyncRoot) { if (this._submitRespQueue.Count > 0) { return this._submitRespQueue.Dequeue(); } } return null; } } } }