public async Task <IReadOnlyCollection <ChatRoom> > ListRooms(CancellationToken token = default) { var operationToken = CancellationTokenSource.CreateLinkedTokenSource(clientLifetime.Token, token).Token; var request = new ListRoomsRequest(); var response = await transport.Exchange <ListRoomsResponse>(request, operationToken); return(response.Rooms); }
public override async Task ListRooms(ListRoomsRequest request, IServerStreamWriter <AvailableRoom> responseStream, ServerCallContext context) { if (_chatRooms.IsEmpty) { //await responseStream.WriteAsync(new AvailableRoom()); return; } var keys = _chatRooms.Keys; for (int i = 0; i < keys.Count; i++) { var item = new AvailableRoom(); var room = keys.ElementAt(i); var participants = _chatRooms[room]; item.RoomName = room.Name; item.Participants = String.Join(",", participants.Take(5)); //send them slowly, theres no need to rush this, after all //the concurrent dictionary is subject to locks await responseStream.WriteAsync(item); } }