/// <summary> /// background worker getting request from the blocking queue and send it out. /// </summary> private async void SendMessageWorker() { Debug.WriteLine("Entering OODSS Send Message Loop"); while (_isRunning && !_cancellationTokenSource.Token.IsCancellationRequested) { try { //Hold the thread here until it receives a request to be processed. RequestQueueObject q = _requestQueue.Take(_cancellationTokenSource.Token); // push pull Debug.WriteLine("Trying to send the string: {0}", q.Uid); //SendDone = new ManualResetEventSlim(false); await CreatePacketFromMessageAndSend(q); //SendDone.Wait(_cancellationTokenSource.Token); Debug.WriteLine("---sent Request: {0}", q.Uid); } catch (OperationCanceledException e) { Debug.WriteLine("SendWorker: The operation was cancelled." + e.CancellationToken); break; } catch (Exception e) { Debug.WriteLine("Caught Exception :\n " + e.StackTrace); } } }
/// <summary> /// prepare the message and send it to the websocket server /// </summary> /// <param name="requestObject"></param> private async Task CreatePacketFromMessageAndSend(RequestQueueObject requestObject) { long uid = requestObject.Uid; string requestString = GenerateStringFromRequest(requestObject.RequestMessage); byte[] uidBytes = BitConverter.GetBytes(uid); byte[] messageBytes = Encoding.UTF8.GetBytes(requestString); byte[] outMessage = new byte[uidBytes.Length + messageBytes.Length]; Buffer.BlockCopy(uidBytes, 0, outMessage, 0, uidBytes.Length); Buffer.BlockCopy(messageBytes, 0, outMessage, uidBytes.Length, messageBytes.Length); await OODSSPlatformSpecifics.Get().SendMessageFromWebSocketClientAsync(_webSocketClient, outMessage); }
/// <summary> /// Send Request Message asynchronously and get response /// </summary> /// <param name="request">request message</param> /// <returns>response message</returns> public async Task <ResponseMessage> RequestAsync(RequestMessage request) { TaskCompletionSource <ResponseMessage> tcs = new TaskCompletionSource <ResponseMessage>(); long currentMessageUid = GenerateUid(); RequestQueueObject queueRequest = new RequestQueueObject(request, currentMessageUid, tcs); _pendingRequests.Put(currentMessageUid, queueRequest); _requestQueue.Add(queueRequest); return(await tcs.Task); }
/// <summary> /// Send Request Message asynchronously and get response /// </summary> /// <param name="request">request message</param> /// <returns>response message</returns> public async Task<ResponseMessage> RequestAsync(RequestMessage request) { TaskCompletionSource<ResponseMessage> tcs = new TaskCompletionSource<ResponseMessage>(); long currentMessageUid = GenerateUid(); RequestQueueObject queueRequest = new RequestQueueObject(request, currentMessageUid, tcs); _pendingRequests.Put(currentMessageUid, queueRequest); _requestQueue.Add(queueRequest); return await tcs.Task; }