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(); } }
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; } }