private static void AppendIncomingPacketHandler(string key, ResponsHandlerCallBackDelegate responsHandlerDelgatePointer) { lock (_syncRoot) { if (incomingResponsHandlers.ContainsKey(key)) { incomingResponsHandlers[key].Add(responsHandlerDelgatePointer); } else { incomingResponsHandlers.Add(key, new List <ResponsHandlerCallBackDelegate>() { responsHandlerDelgatePointer }); } } }
/// <summary> /// 发送数据 /// </summary> /// <param name="pid"></param> /// <param name="command"></param> /// <param name="data"></param> /// <returns></returns> private SocketRespons SendData(int pid, Command command, object data = null) { if (!userConnections.ContainsKey(pid)) { throw new Exception("当前微信Id不在线。"); } SocketRespons respons = null; string key = Guid.NewGuid().ToString(); JObject obj = null; if (data != null) { obj = QNSerialize.DeserializeObject <JObject>(QNSerialize.SerializeObject(data)); } else { obj = new JObject(); } obj.Add("Code", (int)command); obj.Add("Callback", key); var encode = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(obj.ToString())); userConnections[pid].Connection.Send(encode); AutoResetEvent returnWaitSignal = new AutoResetEvent(false); ResponsHandlerCallBackDelegate SendReceiveDelegate = (result) => { respons = result; returnWaitSignal.Set(); }; AppendIncomingPacketHandler(key, SendReceiveDelegate); if (!returnWaitSignal.WaitOne(30 * 1000))//三十秒超时 { RemoveIncomingPacketHandler(key, SendReceiveDelegate); throw new QNException(26, "请求超时。", null); } RemoveIncomingPacketHandler(key, SendReceiveDelegate); if (respons.Error != 0) { throw new QNException((uint)respons.Error, respons.Message); } return(respons); }
private static void RemoveIncomingPacketHandler(string key, ResponsHandlerCallBackDelegate responsHandlerDelgatePointer) { lock (_syncRoot) { if (incomingResponsHandlers.ContainsKey(key)) { ResponsHandlerCallBackDelegate toRemove = null; foreach (var handler in incomingResponsHandlers[key]) { if (handler == responsHandlerDelgatePointer) { toRemove = handler; break; } } if (toRemove != null) { incomingResponsHandlers[key].Remove(toRemove); } } } }