예제 #1
0
        protected override sealed void SendRequestAndGetResult <T> (Uri requestUri, RequestState <T> pubnubRequestState, PubnubWebRequest request)
        {
#if (SILVERLIGHT || WINDOWS_PHONE)
            //For WP7, Ensure that the RequestURI length <= 1599
            //For SL, Ensure that the RequestURI length <= 1482 for Large Text Message. If RequestURI Length < 1343, Successful Publish occurs
            IAsyncResult asyncResult     = request.BeginGetResponse(new AsyncCallback(UrlProcessResponseCallback <T>), pubnubRequestState);
            Timer        webRequestTimer = new Timer(OnPubnubWebRequestTimeout <T>, pubnubRequestState, GetTimeoutInSecondsForResponseType(pubnubRequestState.Type) * 1000, Timeout.Infinite);
#else
            IAsyncResult asyncResult = request.BeginGetResponse(new AsyncCallback(UrlProcessResponseCallback <T>), pubnubRequestState);
            ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, new WaitOrTimerCallback(OnPubnubWebRequestTimeout <T>), pubnubRequestState, GetTimeoutInSecondsForResponseType(pubnubRequestState.Type) * 1000, true);
#endif
            if (pubnubRequestState.Type == ResponseType.Presence || pubnubRequestState.Type == ResponseType.Subscribe)
            {
                if (presenceHeartbeatTimer != null)
                {
                    presenceHeartbeatTimer.Dispose();
                    presenceHeartbeatTimer = null;
                }
                if (pubnubRequestState.Channels != null && pubnubRequestState.Channels.Length > 0 && pubnubRequestState.Channels.Where(s => s.Contains("-pnpres") == false).ToArray().Length > 0)
                {
                    RequestState <T> presenceHeartbeatState = new RequestState <T>();
                    presenceHeartbeatState.Channels      = pubnubRequestState.Channels;
                    presenceHeartbeatState.Type          = ResponseType.PresenceHeartbeat;
                    presenceHeartbeatState.ErrorCallback = pubnubRequestState.ErrorCallback;
                    presenceHeartbeatState.Request       = null;
                    presenceHeartbeatState.Response      = null;

                    if (base.PresenceHeartbeatInterval > 0)
                    {
                        presenceHeartbeatTimer = new Timer(OnPresenceHeartbeatIntervalTimeout <T>, presenceHeartbeatState, base.PresenceHeartbeatInterval * 1000, base.PresenceHeartbeatInterval * 1000);
                    }
                }
            }
        }
예제 #2
0
 protected override sealed void SendRequestAndGetResult <T> (Uri requestUri, RequestState <T> pubnubRequestState, PubnubWebRequest request)
 {
     if ((pubnubRequestState.Type == ResponseType.Publish) && (RequestIsUnsafe(requestUri)))
     {
         SendRequestUsingTcpClient <T> (requestUri, pubnubRequestState);
     }
     else
     {
         IAsyncResult asyncResult = request.BeginGetResponse(new AsyncCallback(UrlProcessResponseCallback <T>), pubnubRequestState);
         if (!asyncResult.AsyncWaitHandle.WaitOne(GetTimeoutInSecondsForResponseType(pubnubRequestState.Type) * 1000))
         {
             OnPubnubWebRequestTimeout <T> (pubnubRequestState, true);
         }
     }
 }