/// <summary> /// Creates a new args object for the <see cref="IRemoteServer.MessageReceived"/> event. /// </summary> /// <param name="message">The message received.</param> /// <param name="sendMode">The send mode the message was received with.</param> /// <param name="remoteServer">The server the message was received from.</param> public static ServerMessageReceivedEventArgs Create(Message message, SendMode sendMode, IRemoteServer remoteServer) { ServerMessageReceivedEventArgs messageReceivedEventArgs = ServerObjectCache.GetServerMessageReceivedEventArgs(); messageReceivedEventArgs.message = message; messageReceivedEventArgs.SendMode = sendMode; messageReceivedEventArgs.RemoteServer = remoteServer; messageReceivedEventArgs.isCurrentlyLoungingInAPool = false; return(messageReceivedEventArgs); }
public static void ReturnServerMessageReceivedEventArgs(ServerMessageReceivedEventArgs writer) { if (!initialized) { ThreadInitialize(); } #if DEBUG ServerObjectCacheTestHelper.ServerMessageReceivedEventArgsWasReturned(); #endif serverMessageReceivedEventArgsPool.ReturnInstance(writer); }
/// <summary> /// Handles a message received. /// </summary> /// <param name="message">The message that was received.</param> /// <param name="sendMode">The send mode the emssage was received with.</param> private void HandleMessage(Message message, SendMode sendMode) { // Get another reference to the message so 1. we can control the backing array's lifecycle and thus it won't get disposed of before we dispatch, and // 2. because the current message will be disposed of when this method returns. Message messageReference = message.Clone(); void DoMessageReceived() { ServerMessageReceivedEventArgs args = ServerMessageReceivedEventArgs.Create(message, sendMode, this); long startTimestamp = Stopwatch.GetTimestamp(); try { MessageReceived?.Invoke(this, args); } catch (Exception e) { messageReceivedEventFailuresCounter.Increment(); logger.Error("A plugin encountered an error whilst handling the MessageReceived event. (See logs for exception)", e); } finally { // Now we've executed everything, dispose the message reference and release the backing array! messageReference.Dispose(); args.Dispose(); } double time = (double)(Stopwatch.GetTimestamp() - startTimestamp) / Stopwatch.Frequency; messageReceivedEventTimeHistogram.Report(time); } //Inform plugins threadHelper.DispatchIfNeeded(DoMessageReceived); }