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);
        }
Exemple #2
0
        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);
                     }
                 }
             }
         }
     }));
 }
Exemple #4
0
        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);
                            }
                        }
                    }
                }
            }));
        }