コード例 #1
0
 public static void Write(Stream stream, Bcp.IPacket packet)
 {
     try
     {
         Action <Stream, Bcp.IPacket> writeCallback;
         var isSuccess = writeCallbacks.TryGetValue(packet.GetType(), out writeCallback);
         Debug.Assert(isSuccess);
         writeCallback(stream, packet);
     }
     catch
     {
         stream.Close();
     }
 }
コード例 #2
0
        private void TrySend(Bcp.IPacket newPack)
        {
            switch (connectionState)
            {
            case SessionState.Available:
            {
                var sendingConnectionQueueEnumerator = sendingConnectionQueue.GetEnumerator();
                sendingConnectionQueueEnumerator.MoveNext();
                long time = sendingConnectionQueueEnumerator.Current.Key;
                HashSet <Connection> openConnections = sendingConnectionQueueEnumerator.Current.Value;
                var openConnectionsEnumerator        = openConnections.GetEnumerator();
                openConnectionsEnumerator.MoveNext();
                Connection connection = openConnectionsEnumerator.Current;
                Stream     stream     = connection.stream;
                BcpIO.Write(stream, newPack);
                stream.Flush();
                ResetHeartBeatTimer(connection);
                openConnections.Remove(connection);
                long currentTimeMillis = Environment.TickCount;
                HashSet <Connection> currentOpenConnections;
                openConnections.Remove(connection);
                if (openConnections.Count == 0)
                {
                    sendingConnectionQueue.Remove(time);
                }
                if (sendingConnectionQueue.TryGetValue(currentTimeMillis, out currentOpenConnections))
                {
                    currentOpenConnections.Add(connection);
                }
                else
                {
                    currentOpenConnections = new HashSet <Connection>();
                    currentOpenConnections.Add(connection);
                    sendingConnectionQueue.Add(currentTimeMillis, currentOpenConnections);
                }
                break;
            }

            case SessionState.Unavailable:
                break;
            }
        }