private void PrimitiveReqData(TransferReqDataSchduleInfoManager reqDataSchduleInfoManager, TransferReqDataSchduleInfo currentReqDataSchduleInfo) { var endPoint = reqDataSchduleInfoManager.NotifyMessage.SrcEndPoint; int repeatCount = 0; int mtu, rto; while (repeatCount++ < this._config.MtuRepeatMaxCount) { mtu = TransferParaManager.GetMtu(endPoint); rto = TransferParaManager.GetRto(endPoint); var ep = currentReqDataSchduleInfo.EndPostion - currentReqDataSchduleInfo.Postion; if (mtu > ep) { mtu = (int)ep; } if (mtu <= 0) { break; } var reqMessage = new ResourceRequestMessage(reqDataSchduleInfoManager.NotifyMessage.Header.Rid, currentReqDataSchduleInfo.Postion, mtu); var buffer = reqMessage.GenerateBuffer(); var eventHandleId = reqMessage.ContextId; var eventHandleInfo = AutoEventWaitHandleManager.CreateEventWaitHandle(eventHandleId, reqDataSchduleInfoManager.NotifyMessage.Timeout); try { //_ht[$"{reqMessage.Header.Rid}_{reqMessage.ContextId}"] = _watch.ElapsedMilliseconds; this._net.Send(buffer, endPoint); if (eventHandleInfo.EventWaitHandle.WaitOne(rto)) { currentReqDataSchduleInfo.UpdatePostion(mtu); if (currentReqDataSchduleInfo.IsTransferCompleted()) { //Loger.Warn($"线程[{System.Threading.Thread.CurrentThread.Name}]传输[Rid:{reqDataSchduleInfoManager.NotifyMessage.Header.Rid}],[{currentReqDataSchduleInfo.BeginPostion}-{currentReqDataSchduleInfo.EndPostion}]完成"); } } else { TransferParaManager.RecordMtuAndRto(endPoint, mtu, rto, true); mtu = TransferParaManager.AdjustDownMtu(endPoint); rto = TransferParaManager.AdjustUpRto(endPoint); } } finally { AutoEventWaitHandleManager.RemoveEventWaitHandle(eventHandleId); eventHandleInfo.EventWaitHandle.Dispose(); } } }
private void SendTransferCompletedMessage(SendDataNotifyMessage notifyMessage) { var transferCompletedMessage = new TransferCompletedMessage(notifyMessage); var buffer = transferCompletedMessage.GenerateBuffer(); var id = CacheKeyGenerator.GenerateWaitTransferCompletedAckMessageEventWaitHandleId(notifyMessage.Header.Rid); var eventHandleInfo = AutoEventWaitHandleManager.CreateEventWaitHandle(id); try { long beginTs = TimeEx.GetTimestamp(); long endTs = beginTs; while (!notifyMessage.IsTimeout(beginTs, endTs)) { try { int rto = TransferParaManager.GetRto(notifyMessage.SrcEndPoint); this._net.Send(buffer, notifyMessage.SrcEndPoint); if (eventHandleInfo.EventWaitHandle.WaitOne(rto)) { break; } else { TransferParaManager.AdjustUpRto(notifyMessage.SrcEndPoint); } } catch (SendDataException) { break; } catch (Exception ex) { Loger.Error(ex, "发送传输完成消息异常"); } endTs = TimeEx.GetTimestamp(); } } finally { AutoEventWaitHandleManager.RemoveEventWaitHandle(id); eventHandleInfo.EventWaitHandle.Dispose(); } //注:如果一直都没有收到确认消息,则超时线程处理 }