private void ReceiveCallback(IAsyncResult result) { StateObject state = (StateObject)result.AsyncState; Socket handler = state.WorkSocket; try { int bytesRead = handler.EndReceive(result); state.Builder.Add(state.Buffer, 0, bytesRead); int total = state.Builder.GetInt32(0); if (total == state.Builder.Count) { DataEventArgs dex = DataEventArgs.Parse(state.Builder); lock (ResultTask) { state.Builder.ReSet(); try { DataEventArgs timout = _timeoutTask.FirstOrDefault(o => o.TaskId == dex.TaskId); if (timout == null) { ResultTask.AddOrUpdate(dex.TaskId, dex, (key, value) => value = dex); } } catch (Exception ex) { Console.WriteLine(ex); ResultTask.AddOrUpdate(dex.TaskId, dex, (key, value) => value = dex); } } try { TaskTicks time = new TaskTicks(); if (RunTime.TryGetValue(dex.TaskId, out time)) { time.OutQueTime = DateTime.Now.Ticks; RunTime.TryUpdate(dex.TaskId, time, time); } } catch (Exception ex) { Console.WriteLine(ex); } } else { handler.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } } catch (Exception ex) { state.Builder.ReSet(); GC.Collect(); Console.WriteLine(ex); _log.Error(ex); } }
public virtual DataEventArgs GetResult(DataEventArgs e) { DataEventArgs arg = new DataEventArgs(); try { var cts = new CancellationTokenSource(_config.GetValue("server", "timeout", 15) * 1000); while (!cts.Token.IsCancellationRequested) { if (ResultTask.TryGetValue(e.TaskId, out arg)) { arg.StatusCode = StatusCode.Success; Channels[arg.CallHashCode].ActiveHash = 0; try { StateObject oo = new StateObject(); RunStateObjects.TryRemove(arg.TaskId, out oo); if (oo != null) { oo.Builder.ReSet(); } DataEventArgs outarg = new DataEventArgs(); ResultTask.TryRemove(arg.TaskId, out outarg); RuningTask.TryRemove(arg.TaskId, out outarg); } catch (Exception ex) { Console.WriteLine(ex); } try { TaskTicks time = new TaskTicks(); if (RunTime.TryGetValue(arg.TaskId, out time)) { time.EndTime = DateTime.Now.Ticks; RunTime.TryUpdate(arg.TaskId, time, time); _log.Debug("RunTime:\r\n" + arg + "\r\n" + time + "\r\n"); } } catch (Exception ex) { Console.WriteLine(ex); } return(arg); } Thread.Sleep(3); } } catch (Exception ex) { arg.StatusCode = StatusCode.Serious; _log.Error(ex); Console.WriteLine(ex); Channels[e.CallHashCode].ActiveHash = 0; return(arg); } _log.Info(e.TaskId + "超时"); _timeoutTask.Add(e); e.StatusCode = StatusCode.TimeOut; return(e); }
/// <summary> /// /// </summary> /// <param name="e"></param> /// <param name="channel"></param> /// <returns></returns> /// public override void Call(object dataev, int i) { DataEventArgs e = (DataEventArgs)dataev; try { TaskTicks time = new TaskTicks(); if (RunTime.TryGetValue(e.TaskId, out time)) { time.IntoQueTime = DateTime.Now.Ticks; RunTime.TryUpdate(e.TaskId, time, time); } } catch (Exception ex) { Console.WriteLine(ex); } Stopwatch watch = new Stopwatch(); watch.Start(); ChannelPool channel = Channels[i]; try { e.CallHashCode = i; Socket _client = channel.Client; if (_client == null || _client.Connected != true) { channel.Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); channel.Client.Connect(channel.IpPoint); channel.Available = true; } _client = channel.Client; byte[] _bf = e.ToByteArray(); #region 異步 _client.BeginSend(_bf, 0, _bf.Length, SocketFlags.None, null, null); #endregion #region 異步接收 StateObject state = new StateObject(); RunStateObjects.TryAdd(e.TaskId, state); state.WorkSocket = _client; state.Builder.ReSet(); SocketError error; _client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, out error, ReceiveCallback, state); #endregion watch.Stop(); //monitor.Write(e.TaskId, e.ActionCmd, "...", watch.ElapsedMilliseconds, _bf.LongLength.ToString()); Channels[i].PingActives = DateTime.Now.Ticks; } catch (SocketException sex) { foreach (ChannelPool p in Channels) { if (p.IpPoint == channel.IpPoint) { p.Available = false; } } e.StatusCode = StatusCode.Error; lock (ResultTask) { e.StatusCode = StatusCode.Serious; DataEventArgs timout = _timeoutTask.FirstOrDefault(o => o.TaskId == e.TaskId); if (timout == null) { ResultTask.AddOrUpdate(e.TaskId, e, (key, value) => value = e); } else { _timeoutTask.Remove(timout); } } _log.Error(sex); } catch (Exception ex) { Console.WriteLine(ex); lock (ResultTask) { e.StatusCode = StatusCode.Serious; DataEventArgs timout = _timeoutTask.FirstOrDefault(o => o.TaskId == e.TaskId); if (timout == null) { ResultTask.AddOrUpdate(e.TaskId, e, (key, value) => value = e); } else { _timeoutTask.Remove(timout); } } _log.Error(ex); } }