private async Task RunAsync(CancellationToken cancellationToken) { using (var client = new TcpClient()) { _logger.LogDebug("Connecting to tcp server on port {port}", _port); await client.ConnectAsync(IPAddress.Loopback, _port); _logger.LogDebug("Connected"); using (var stream = client.GetStream()) using (var reader = new BinaryReader(stream)) using (var writer = new BinaryWriter(stream)) { while (!cancellationToken.IsCancellationRequested) { while (!stream.DataAvailable) { if (!client.Client.IsConnected()) { OnDisconnected?.Invoke(this, EventArgs.Empty); return; } await Task.Delay(10, cancellationToken); } // Request _logger.LogDebug("Received reqeust from client"); var fileChange = FileChangeSerializer.Deserialize(reader); var cakeScript = CakeScript.Empty; try { cakeScript = _service.Generate(fileChange); } catch (Exception e) { _logger.LogError(0, e, "Unhandled Exception while processing request."); } // Response _logger.LogDebug("Sending response to client"); CakeScriptSerializer.Serialize(writer, cakeScript); writer.Flush(); } } } }
public CakeScript Generate(FileChange fileChange) { _initializedEvent.WaitOne(); lock (_sendReceiveLock) { // Send _logger.LogDebug("Sending request to server"); FileChangeSerializer.Serialize(_writer, fileChange, Constants.Protocol.Latest); _writer.Flush(); while (!_stream.DataAvailable) { Task.Delay(10).Wait(); } // Receive _logger.LogDebug("Received response from server"); return(CakeScriptSerializer.Deserialize(_reader)); } }