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 override void Call(object obj, int len) { DataEventArgs outDea = new DataEventArgs(); DataEventArgs ea = (DataEventArgs)obj; try { if (RuningTask == null) { RuningTask = new ConcurrentDictionary <int, DataEventArgs>(); } RuningTask.AddOrUpdate(ea.TaskId, ea, (key, value) => value = ea); string url = "http://" + Channels[len].IpPoint.Address.ToString() + ":" + (Channels[len].IpPoint.Port + 1); Dictionary <string, string> header = new Dictionary <string, string>(); header.Add("Authorization", "Basic " + this.Authorization); int p = ea.ActionParam.LastIndexOf("."); List <object> eabinary = Serializer.ToEntity <List <object> >(ea.Binary); string code = ea.ActionParam.Substring(p + 1); Dictionary <string, string> param = new Dictionary <string, string>(); param.Add("", Serializer.ToString(eabinary)); var result = HttpPost.Post(url + "/" + code, param, header); DataEventArgs redata = Serializer.ToEntity <DataEventArgs>(result.Item2); if (result.Item1 == HttpStatusCode.OK) { ea.StatusCode = StatusCode.Success; dynamic dyjs = Serializer.ToEntity <dynamic>(redata.Json); ea.Json = dyjs.data.ToString(); ea.Param = redata.Param; ResultTask.AddOrUpdate(ea.TaskId, ea, (key, value) => value = ea); } else { ea.StatusCode = StatusCode.Error; if (HttpStatusCode.Moved == result.Item1) { ea.Json = result.Item2; RuningTask.TryRemove(ea.TaskId, out outDea); Channels[len].Available = false; ClientTask.Enqueue(ea); CheckServer(); } else { ea.Json = result.Item2; ResultTask.AddOrUpdate(ea.TaskId, ea, (key, value) => value = ea); } } } catch (Exception ex) { Console.WriteLine(ex); _log.Error(ex + ex.StackTrace); ea.StatusCode = StatusCode.TimeOut; ea.TryTimes++; if (ea.TryTimes < 3) { RuningTask.TryRemove(ea.TaskId, out outDea); ClientTask.Enqueue(ea); return; } ResultTask.AddOrUpdate(ea.TaskId, ea, (key, value) => value = ea); return; } finally { for (int i = 0; i < Channels.Count; i++) { if (Channels[i].ActiveHash == ea.TaskId) { Channels[i].ActiveHash = 0; } } RuningTask.TryRemove(ea.TaskId, out outDea); } }
/// <summary> /// /// </summary> /// <param name="e"></param> /// <param name="channel"></param> /// <returns></returns> /// public override void Call(object dataev, int i) { Stopwatch watch = new Stopwatch(); watch.Start(); DataEventArgs e = (DataEventArgs)dataev; 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) { 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); } }