Exemple #1
0
        private async Task <ConnectionData> HandleRejectedRequest(CancellationToken cancellationToken)
        {
            var response = new RejectedGenerationResponse();
            await response.WriteAsync(_stream, cancellationToken).ConfigureAwait(false);

            return(new ConnectionData(CompletionReason.CompilationNotStarted));
        }
Exemple #2
0
        /// <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);
            }
        }