private async Task ProcessAsync(Uri url, HttpResponseMessage response) { // Start sending and polling (ask for binary if the server supports it) var receiving = ProcessEventStream(_application, response, _transportCts.Token); var sending = SendUtils.SendMessages(url, _application, _httpClient, _logger); // Wait for send or receive to complete var trigger = await Task.WhenAny(receiving, sending); if (trigger == receiving) { // We're waiting for the application to finish and there are 2 things it could be doing // 1. Waiting for application data // 2. Waiting for an outgoing send (this should be instantaneous) // Cancel the application so that ReadAsync yields _application.Input.CancelPendingRead(); } else { // Set the sending error so we communicate that to the application _error = sending.IsFaulted ? sending.Exception.InnerException : null; _transportCts.Cancel(); // Cancel any pending flush so that we can quit _application.Output.CancelPendingFlush(); } }
private async Task ProcessAsync(Uri url) { // Start sending and polling (ask for binary if the server supports it) var receiving = Poll(url, _transportCts.Token); var sending = SendUtils.SendMessages(url, _application, _httpClient, _logger); // Wait for send or receive to complete var trigger = await Task.WhenAny(receiving, sending); if (trigger == receiving) { // We don't need to DELETE here because the poll completed, which means the server shut down already. // We're waiting for the application to finish and there are 2 things it could be doing // 1. Waiting for application data // 2. Waiting for an outgoing send (this should be instantaneous) // Cancel the application so that ReadAsync yields _application.Input.CancelPendingRead(); await sending; } else { // Set the sending error so we communicate that to the application _error = sending.IsFaulted ? sending.Exception.InnerException : null; // Cancel the poll request _transportCts.Cancel(); // Cancel any pending flush so that we can quit _application.Output.CancelPendingFlush(); await receiving; // Send the DELETE request to clean-up the connection on the server. await SendDeleteRequest(url); } }