private async Task <ConnectionData> HandleRejectedRequest(CancellationToken cancellationToken) { var response = new RejectedGenerationResponse(); await response.WriteAsync(_stream, cancellationToken).ConfigureAwait(false); return(new ConnectionData(CompletionReason.CompilationNotStarted)); }
/// <summary> /// Try to compile using the server. Returns a null-containing Task if a response /// from the server cannot be retrieved. /// </summary> private static async Task <GenerationResponse> TryGeneration(NamedPipeClientStream pipeStream, GenerationRequest request, CancellationToken cancellationToken) { GenerationResponse response; using (pipeStream) { // Write the request try { _log.Debug("Begin writing request"); await request.WriteAsync(pipeStream, cancellationToken).ConfigureAwait(false); _log.Debug("End writing request"); } catch (Exception e) { _log.Error($"Error writing build request. {e.Message}", e); return(new RejectedGenerationResponse()); } // Wait for the compilation and a monitor to detect if the server disconnects var serverCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); _log.Debug("Begin reading response"); var responseTask = GenerationResponse.ReadAsync(pipeStream, serverCts.Token); var monitorTask = CreateMonitorDisconnectTask(pipeStream, "client", serverCts.Token); await Task.WhenAny(responseTask, monitorTask).ConfigureAwait(false); _log.Debug("End reading response"); if (responseTask.IsCompleted) { // await the task to log any exceptions try { response = await responseTask.ConfigureAwait(false); } catch (Exception e) { _log.Error("Error reading response", e); response = new RejectedGenerationResponse(); } } else { _log.Debug("Server disconnect"); response = new RejectedGenerationResponse(); } // Cancel whatever task is still around serverCts.Cancel(); Debug.Assert(response != null); return(response); } }