/// <summary>
 /// Client code don't use it if AsyncWebSocketRequests.Instance.Start() is not called which will use a bunch of threads to
 /// send websocket requests asynchronously
 /// </summary>
 /// <param name="webSocketRequest"></param>
 /// <returns></returns>
 public object AsyncSendRequest(WebSocketRequest webSocketRequest)
 {
     var syncRequest = new WebSocketSyncRequest(webSocketRequest);
     WebSocketNotificationHandler.InitWaitEvent(syncRequest);
     AsyncWebSocketRequests.Instance.Add(syncRequest.Request);
     return WebSocketNotificationHandler.WaitResponse(syncRequest);
 }
 public static object SendRequestReturnResult(WebSocketClient handler, WebSocketRequest request)
 {
     var syncRequest = new WebSocketSyncRequest(request);
     WebSocketNotificationHandler.InitWaitEvent(syncRequest);
     object result = null;
     if (handler.SendRequest(request))
     {
         result = WebSocketNotificationHandler.WaitResponse(syncRequest);
     }
     return result;
 }
 /// <summary>
 /// Wait the response for syncRequest
 /// </summary>
 /// <param name="syncRequest"></param>
 /// <returns></returns>
 public static object WaitResponse(WebSocketSyncRequest syncRequest)
 {
     TimeSpan timeoutSpan = NotifyTimeout;
     //For PutFileProxyRequest, because it's an internal request which is only processed in ESS client
     // to make sure the block of file bytes will be sent to same child ESS. If one video file is a little
     // huge, it may spend more than 1min(default), so we set the timeout time to be 30min which should be
     // enough to send a video file.
     if (syncRequest.Request.RequestType == WebSocketRequestType.PutFileProxyRequest)
     {
         timeoutSpan = TimeSpan.FromMinutes(30);
     }
     if (!syncRequest.WaitEvent.WaitOne(timeoutSpan))
     {
         RequestsOnNotification.Remove(syncRequest.Request.RequestId);
         Console.WriteLine("Timeout for this WebSocket request " + syncRequest.Request);
         return false;
     }
     object status;
     if ((status = Responses.Get(syncRequest.Request.RequestId)) != null)
     {
         Responses.Remove(syncRequest.Request.RequestId);
     }
     return status;
 }
 /// <summary>
 /// Add syncRequest into the notification dictionary
 /// </summary>
 /// <param name="syncRequest"></param>
 public static void InitWaitEvent(WebSocketSyncRequest syncRequest)
 {
     RequestsOnNotification.Set(syncRequest.Request.RequestId, syncRequest.WaitEvent);
 }