/// <summary> /// Sets the connection being used by this remote server. /// </summary> /// <param name="pendingServer">The connection to switch to.</param> internal void SetConnection(PendingDownstreamRemoteServer pendingServer) { if (connection != null) { connection.MessageReceived -= MessageReceivedHandler; connection.Disconnected -= DisconnectedHandler; } connection = pendingServer.Connection; // Switch out message received handler from the pending server connection.MessageReceived = MessageReceivedHandler; connection.Disconnected = DisconnectedHandler; EventHandler <ServerConnectedEventArgs> handler = ServerConnected; if (handler != null) { void DoServerConnectedEvent() { long startTimestamp = Stopwatch.GetTimestamp(); try { handler?.Invoke(this, new ServerConnectedEventArgs(this)); } catch (Exception e) { serverConnectedEventFailuresCounter.Increment(); logger.Error("A plugin encountered an error whilst handling the ServerConnected event. The server will still be connected. (See logs for exception)", e); } double time = (double)(Stopwatch.GetTimestamp() - startTimestamp) / Stopwatch.Frequency; serverConnectedEventTimeHistogram.Report(time); } threadHelper.DispatchIfNeeded(DoServerConnectedEvent); } // Handle all messages that had queued foreach (PendingDownstreamRemoteServer.QueuedMessage queuedMessage in pendingServer.GetQueuedMessages()) { HandleMessage(queuedMessage.Message, queuedMessage.SendMode); queuedMessage.Message.Dispose(); } }