private async Task <LicensorResponse> GetResponseAsync(LicensorRequest request, int timeoutMilliseconds = 30 * 1000) { try { TaskCompletionSource <LicensorResponse> taskCompletionSource = new TaskCompletionSource <LicensorResponse>(TaskCreationOptions.RunContinuationsAsynchronously); responseTasks.Add(request.RequestId, taskCompletionSource); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(timeoutMilliseconds); cancellationTokenSource.Token.ThrowIfCancellationRequested(); var responseTask = taskCompletionSource.Task; var responseWaitTask = Task.Run(async() => await responseTask.ConfigureAwait(false), cancellationTokenSource.Token); while (responseWaitTask.Status == TaskStatus.Running) { cancellationTokenSource.Token.ThrowIfCancellationRequested(); await Task.Delay(100).ConfigureAwait(false); } var response = await responseWaitTask.ConfigureAwait(false); cancellationTokenSource.Dispose(); return(response); } catch (TaskCanceledException) { throw new ResponseException("Response timed out."); } }
private async Task SendRequestAsync(LicensorRequest request) { Console.WriteLine($"Sending request: {request.RequestType}"); byte[] requestBytes = ObjectSerializer.ObjectToByteArray(request); if (IsEncrypted) { requestBytes = Encryptor.SymmetricDataEncrypt( requestBytes, NodeData.Instance.NodeKeys.SignPrivateKey, symmetricKey, MessageDataType.Binary, NodeData.Instance.NodeKeys.Password); } await webSocket.SendAsync(requestBytes, WebSocketMessageType.Binary, true, CancellationToken.None).ConfigureAwait(false); }