private static async Task WriteNextGameState(GameOfLifeRequest request, IServerStreamWriter <GameOfLifeResponse> responseStream, int chunkSize, IEnumerable <int> nextState) { GameOfLifeResponse gameStateResponse; if (chunkSize == 0) { gameStateResponse = new GameOfLifeResponse(); gameStateResponse.GameState.AddRange(nextState); await responseStream.WriteAsync(gameStateResponse); } else { for (int i = 0; i < nextState.Count(); i += chunkSize) { gameStateResponse = new GameOfLifeResponse(); gameStateResponse.GameState.AddRange(nextState.Skip(i).Take(chunkSize)); await responseStream.WriteAsync(gameStateResponse); } } }
public override async Task GetState(GameOfLifeRequest request, IServerStreamWriter <GameOfLifeResponse> responseStream, ServerCallContext context) { var cancellationToken = context.CancellationToken; Guid gameId = Guid.Parse(request.GameId); GameOfLife _gameOfLife = new GameOfLife(gameId, request.GameSettings.Width, request.GameSettings.Height); await WriteNextGameState(request, responseStream, request.GameSettings.ChunkSize, _gameOfLife.SeedGame(5)); while (!cancellationToken.IsCancellationRequested) { try { await WriteNextGameState(request, responseStream, request.GameSettings.ChunkSize, _gameOfLife.SpawnNextGeneration()); } catch (OperationCanceledException) { _logger.LogInformation("Subscriber disconnected."); break; } } }
public override async Task GetState(GameOfLifeRequest request, IServerStreamWriter <GameOfLifeResponse> responseStream, ServerCallContext context) { _logger.LogInformation("Getting game state."); try { var response = _client.GetState(request, headers: context.RequestHeaders, cancellationToken: context.CancellationToken); while (await response.ResponseStream.MoveNext(context.CancellationToken)) { System.Console.WriteLine($"NextState: {response.ResponseStream.Current.GameState.Count}"); await responseStream.WriteAsync(response.ResponseStream.Current); } } catch (RpcException rpcException) { // cancelled, so... } catch (OperationCanceledException) { // cancelled, so... } }