private void CreateMessagePipeline(PipelineManualResetEventSlim slim, long bagid) { new Action(() => { try { slim.Reset(); slim.Wait(30000); if (!slim.IsTimeOut) { var message = EntityBufCore.DeSerialize <Message>(slim.MsgBuffer); DispatchMessage(message); } else { Console.Write("接收超时:" + bagid); OnError(new TimeoutException("接收超时")); } } finally { ClearTempBag(bagid, null); _pipelineSlimDic.Remove(bagid); } }).BeginInvoke(null, null); }
private void CreateMessagePipeline(IPEndPoint endpoint, PipelineManualResetEventSlim slim, long bagid, string pipelinekey) { new Action(() => { int trytimes = 0; try { while (true) { slim.Reset(); slim.Wait(30000); if (!slim.IsTimeOut) { var message = LJC.FrameWork.EntityBuf.EntityBufCore.DeSerialize <Message>(slim.MsgBuffer); DispatchMessage(message, endpoint); break; } else { trytimes++; if (trytimes >= TimeOutTryTimes) { throw new TimeoutException(); } } } } finally { _pipelineSlimDic.Remove(pipelinekey); ClearTempBag(bagid, endpoint); } }).BeginInvoke(null, null); }
private void OnMessage(byte[] data) { System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback((o) => { var margebytes = MargeBag(data, null); if (margebytes != null) { var bagid = GetBagId(data); SendEcho(bagid); if (data.Length >= margebytes.Length) { var message = EntityBufCore.DeSerialize <Message>(margebytes); DispatchMessage(message); } else { //发送管道通知 PipelineManualResetEventSlim slim = null; //通知管道 if (_pipelineSlimDic.TryGetValue(bagid, out slim)) { slim.MsgBuffer = margebytes; slim.Set(); } } } else { //创建管道 var bagid = GetBagId(data); PipelineManualResetEventSlim slim = null; if (!_pipelineSlimDic.TryGetValue(bagid, out slim)) { lock (_pipelineSlimDic) { if (!_pipelineSlimDic.TryGetValue(bagid, out slim)) { slim = new PipelineManualResetEventSlim(); slim.BagId = bagid; _pipelineSlimDic.Add(bagid, slim); CreateMessagePipeline(slim, bagid); } } } } })); }
private void OnSocket(object endpoint, int bufferindex, int len) { System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback((o) => { var bytes = new byte[len]; try { var offset = _buffermanager.GetOffset(bufferindex); for (int i = 0; i < len; i++) { bytes[i] = _buffermanager.Buffer[offset + i]; } } finally { _buffermanager.RealseBuffer(bufferindex); } var ipendpoint = (IPEndPoint)endpoint; var bagid = GetBagId(bytes); string pipelinekey = string.Format("{0}:{1}:{2}", ipendpoint.Address.ToString(), ipendpoint.Port, bagid); var mergebuffer = MargeBag(bytes, (IPEndPoint)endpoint); if (mergebuffer != null) { Console.WriteLine("收包:" + bagid); SendEcho((EndPoint)endpoint, bagid); if (mergebuffer.Length <= bytes.Length) { var message = LJC.FrameWork.EntityBuf.EntityBufCore.DeSerialize <Message>(mergebuffer); DispatchMessage(message, (IPEndPoint)endpoint); } else { PipelineManualResetEventSlim slim = null; //通知管道 if (_pipelineSlimDic.TryGetValue(pipelinekey, out slim)) { slim.MsgBuffer = mergebuffer; slim.Set(); } } } else { //创建管道 PipelineManualResetEventSlim slim = null; if (!_pipelineSlimDic.TryGetValue(pipelinekey, out slim)) { lock (_pipelineSlimDic) { if (!_pipelineSlimDic.TryGetValue(pipelinekey, out slim)) { slim = new PipelineManualResetEventSlim(); slim.BagId = bagid; CreateMessagePipeline((IPEndPoint)endpoint, slim, bagid, pipelinekey); _pipelineSlimDic.Add(pipelinekey, slim); } } } } })); }