Beispiel #1
0
 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
             });
         }
     }
 }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        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);
                    }
                }
            }
        }