コード例 #1
0
        public async Task PresencesInitializedWithConcurrentJoins()
        {
            const int numMembers = 5;

            var leaderSession = await _client.AuthenticateCustomAsync($"{Guid.NewGuid()}");

            var leaderSocket = Nakama.Socket.From(_client);
            await leaderSocket.ConnectAsync(leaderSession);

            var memberSessions = new ISession[numMembers];
            var memberSockets  = new Nakama.ISocket[numMembers];

            IParty party = await leaderSocket.CreatePartyAsync(true, numMembers);

            var memberPartyObjects = new IParty[numMembers];

            int partyObjCounter = 0;


            for (int i = 0; i < numMembers; i++)
            {
                memberSessions[i] = await _client.AuthenticateCustomAsync($"{Guid.NewGuid()}");

                memberSockets[i] = (Nakama.Socket.From(_client));
                await memberSockets[i].ConnectAsync(memberSessions[i]);

                memberSockets[i].ReceivedParty += party => {
                    memberPartyObjects[partyObjCounter] = party;
                    Interlocked.Increment(ref partyObjCounter);
                };

                memberSockets[i].JoinPartyAsync(party.Id);
            }

            while (partyObjCounter < numMembers)
            {
                await Task.Delay(25);
            }

            // includes duplicates
            var combinedPresences = memberPartyObjects.SelectMany(party => party.Presences);

            foreach (var presence in combinedPresences)
            {
                Assert.False(string.IsNullOrEmpty(presence.UserId));
                Assert.False(string.IsNullOrEmpty(presence.Username));
                Assert.False(string.IsNullOrEmpty(presence.SessionId));
            }

            await leaderSocket.CloseAsync();

            foreach (var memberSocket in memberSockets)
            {
                await memberSocket.CloseAsync();
            }
        }