Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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...
            }
        }