Ejemplo n.º 1
0
        /// <summary>
        /// Send a packet to all the connected clients
        /// </summary>
        /// <param name="packet">Packet to send to everyone</param>
        /// <returns>Returns a task that you can wait on with a dictionary containing success per client</returns>
        /// <remarks>This uses more memory/processing than the very similar <see cref="SendToAllAsync"/>. Use that if you don't care about the results</remarks>
        /// <remarks>Even though this method is async, be sure this method is not called in parallel.
        /// Otherwise you can get mangled packets.</remarks>
        public async Task <Dictionary <ServerClient, bool> > SendToAllWithResultAsync(IPacket packet)
        {
            if (!IsRunning)
            {
                Logger.Warn("The server is not running, not sending packet");
                return(null);
            }

            var bytes             = packet.Serialize();
            var connectedClients1 = ConnectedClients.ToArray();
            var tasks             = new Task <bool> [connectedClients1.Length];

            for (var i = 0; i < connectedClients1.Length; i++)
            {
                Logger.Debug("Sending packet to {client}: {packet}", clients[i].EndPoint, packet);
                tasks[i] = SendAsync(bytes, clients[i]);
            }

            var connectedClients = connectedClients1;

            var result = await Task.WhenAll(tasks);

            return(connectedClients
                   .Zip(result, (k, v) => new { k, v })
                   .ToDictionary(x => x.k, x => x.v));
        }