/// <summary>
        ///
        /// </summary>
        /// <param name="requestStream"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public async override Task <PlayerSearchResponse> SearchPlayer_ClientStream(IAsyncStreamReader <PlayerSearchRequest> requestStream, ServerCallContext context)
        {
            string callCounter = GetCallCounter(context);

            IDictionary <string, Team> teams = SampleDataRepository.GetTeams(10);

            PlayerSearchResponse response = new PlayerSearchResponse();

            int initial = 1;

            while (await requestStream.MoveNext().ConfigureAwait(false))
            {
                ThrowExceptionIfRequestedCancel(context);

                PlayerSearchRequest request = requestStream.Current;

                s_Logger.Info(string.Format("[{0}] Requested {1} players.", callCounter, request.ExpectedDataCount));

                foreach (Player player in SampleDataRepository.GeneratePlayers(initial, request.ExpectedDataCount, teams))
                {
                    ThrowExceptionIfRequestedCancel(context);

                    response.Players.Add(player);

                    if (!response.Teams.ContainsKey(player.TeamCode))
                    {
                        response.Teams.Add(player.TeamCode, teams[player.TeamCode]);
                    }
                }

                initial += request.ExpectedDataCount;
            }

            return(response);
        }
        public override Task <TeamSearchResponse> SearchTeam(TeamSearchRequest request, ServerCallContext context)
        {
            string callCounter = GetCallCounter(context);

            s_Logger.Info(string.Format("[{0}] Requested {1} teams.", callCounter, request.ExpectedDataCount));

            IDictionary <string, Team> teams = SampleDataRepository.GetTeams(request.ExpectedDataCount);

            TeamSearchResponse response = new TeamSearchResponse();

            response.Teams.AddRange(teams.Values);

            return(Task.FromResult(response));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="request"></param>
        /// <param name="responseStream"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public async override Task SearchPlayer_ServerStream(PlayerSearchRequest request, IServerStreamWriter <PlayerSearchResponse> responseStream, ServerCallContext context)
        {
            string callCounter = GetCallCounter(context);

            s_Logger.Info(string.Format("[{0}] Requested {1} players.", callCounter, request.ExpectedDataCount));

            IDictionary <string, Team> teams = SampleDataRepository.GetTeams(10);

            PlayerSearchResponse response = new PlayerSearchResponse();

            int fetchCount = 0;

            foreach (Player player in SampleDataRepository.GeneratePlayers(1, request.ExpectedDataCount, teams))
            {
                if (ExitIfRequestedCancel(context))
                {
                    return;
                }

                response.Players.Add(player);

                if (!response.Teams.ContainsKey(player.TeamCode))
                {
                    response.Teams.Add(player.TeamCode, teams[player.TeamCode]);
                }

                ++fetchCount;

                if (fetchCount == s_FetchSize)
                {
                    await Task.Delay(s_DelayMilliseconds).ConfigureAwait(false);

                    await responseStream.WriteAsync(response).ConfigureAwait(false);

                    response.Players.Clear();
                    response.Teams.Clear();
                    fetchCount = 0;
                }
            }

            if (response.Players.Count > 0)
            {
                await Task.Delay(s_DelayMilliseconds).ConfigureAwait(false);

                await responseStream.WriteAsync(response).ConfigureAwait(false);
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="request"></param>
        /// <param name="responseStream"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public async override Task PushPlayer(PlayerSearchRequest request, IServerStreamWriter <PlayerSearchResponse> responseStream, ServerCallContext context)
        {
            string callCounter = GetCallCounter(context);

            s_Logger.Info(string.Format("[{0}] Requested {1} players.", callCounter, request.ExpectedDataCount));

            IDictionary <string, Team> teams = SampleDataRepository.GetTeams(10);

            PlayerSearchResponse response = new PlayerSearchResponse();

            Random r = new Random();

            while (true)
            {
                await Task.Delay(r.Next(5, 20) * 1000);

                if (ExitIfRequestedCancel(context))
                {
                    return;
                }

                foreach (Player player in SampleDataRepository.GeneratePlayers(1, request.ExpectedDataCount, teams))
                {
                    response.Players.Add(player);

                    if (!response.Teams.ContainsKey(player.TeamCode))
                    {
                        response.Teams.Add(player.TeamCode, teams[player.TeamCode]);
                    }
                }

                if (response.Players.Count > 0)
                {
                    await Task.Delay(s_DelayMilliseconds).ConfigureAwait(false);

                    await responseStream.WriteAsync(response).ConfigureAwait(false);
                }
            }
        }