From ec015e76207d4659a8d55d9cfcf44f1050f4cebd Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 25 Nov 2020 21:07:50 +0100 Subject: [PATCH] Refactor naming for background tasks. --- Source/MQTTnet/Client/MqttClient.cs | 2 +- Source/MQTTnet/Implementations/MqttTcpServerListener.cs | 4 ++-- Source/MQTTnet/Internal/TaskExtensions.cs | 6 ++++-- Source/MQTTnet/Server/MqttClientConnection.cs | 2 +- Source/MQTTnet/Server/MqttClientSessionsManager.cs | 2 +- Source/MQTTnet/Server/MqttServerKeepAliveMonitor.cs | 2 +- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Source/MQTTnet/Client/MqttClient.cs b/Source/MQTTnet/Client/MqttClient.cs index 36497498..93a43e17 100644 --- a/Source/MQTTnet/Client/MqttClient.cs +++ b/Source/MQTTnet/Client/MqttClient.cs @@ -355,7 +355,7 @@ namespace MQTTnet.Client { // This handler must be executed in a new thread because otherwise a dead lock may happen // when trying to reconnect in that handler etc. - Task.Run(() => disconnectedHandler.HandleDisconnectedAsync(new MqttClientDisconnectedEventArgs(clientWasConnected, exception, authenticateResult, _disconnectReason))).Forget(_logger); + Task.Run(() => disconnectedHandler.HandleDisconnectedAsync(new MqttClientDisconnectedEventArgs(clientWasConnected, exception, authenticateResult, _disconnectReason))).RunInBackground(_logger); } } } diff --git a/Source/MQTTnet/Implementations/MqttTcpServerListener.cs b/Source/MQTTnet/Implementations/MqttTcpServerListener.cs index 33595d90..ef69890c 100644 --- a/Source/MQTTnet/Implementations/MqttTcpServerListener.cs +++ b/Source/MQTTnet/Implementations/MqttTcpServerListener.cs @@ -78,7 +78,7 @@ namespace MQTTnet.Implementations _socket.Bind(_localEndPoint); _socket.Listen(_options.ConnectionBacklog); - Task.Run(() => AcceptClientConnectionsAsync(cancellationToken), cancellationToken).Forget(_logger); + Task.Run(() => AcceptClientConnectionsAsync(cancellationToken), cancellationToken).RunInBackground(_logger); return true; } @@ -115,7 +115,7 @@ namespace MQTTnet.Implementations continue; } - Task.Run(() => TryHandleClientConnectionAsync(clientSocket), cancellationToken).Forget(_logger); + Task.Run(() => TryHandleClientConnectionAsync(clientSocket), cancellationToken).RunInBackground(_logger); } catch (OperationCanceledException) { diff --git a/Source/MQTTnet/Internal/TaskExtensions.cs b/Source/MQTTnet/Internal/TaskExtensions.cs index 7a14cdd8..e7894702 100644 --- a/Source/MQTTnet/Internal/TaskExtensions.cs +++ b/Source/MQTTnet/Internal/TaskExtensions.cs @@ -5,11 +5,13 @@ namespace MQTTnet.Internal { public static class TaskExtensions { - public static void Forget(this Task task, IMqttNetScopedLogger logger) + public static void RunInBackground(this Task task, IMqttNetScopedLogger logger = null) { task?.ContinueWith(t => { - logger.Error(t.Exception, "Unhandled exception."); + // Consume the exception first so that we get no exception regarding the not observed exception. + var exception = t.Exception; + logger?.Error(exception, "Unhandled exception in background task."); }, TaskContinuationOptions.OnlyOnFaulted); } diff --git a/Source/MQTTnet/Server/MqttClientConnection.cs b/Source/MQTTnet/Server/MqttClientConnection.cs index 44f82945..788cfd53 100644 --- a/Source/MQTTnet/Server/MqttClientConnection.cs +++ b/Source/MQTTnet/Server/MqttClientConnection.cs @@ -160,7 +160,7 @@ namespace MQTTnet.Server await SendAsync(_channelAdapter.PacketFormatterAdapter.DataConverter.CreateConnAckPacket(_connectionValidatorContext), cancellationToken).ConfigureAwait(false); - Task.Run(() => SendPendingPacketsAsync(cancellationToken), cancellationToken).Forget(_logger); + Task.Run(() => SendPendingPacketsAsync(cancellationToken), cancellationToken).RunInBackground(_logger); Session.IsCleanSession = false; diff --git a/Source/MQTTnet/Server/MqttClientSessionsManager.cs b/Source/MQTTnet/Server/MqttClientSessionsManager.cs index 9013b1e9..0dc95190 100644 --- a/Source/MQTTnet/Server/MqttClientSessionsManager.cs +++ b/Source/MQTTnet/Server/MqttClientSessionsManager.cs @@ -50,7 +50,7 @@ namespace MQTTnet.Server public void Start(CancellationToken cancellationToken) { - Task.Run(() => TryProcessQueuedApplicationMessagesAsync(cancellationToken), cancellationToken).Forget(_logger); + Task.Run(() => TryProcessQueuedApplicationMessagesAsync(cancellationToken), cancellationToken).RunInBackground(_logger); } public async Task HandleClientConnectionAsync(IMqttChannelAdapter channelAdapter, CancellationToken cancellationToken) diff --git a/Source/MQTTnet/Server/MqttServerKeepAliveMonitor.cs b/Source/MQTTnet/Server/MqttServerKeepAliveMonitor.cs index 7b050b3a..bd6eaa0a 100644 --- a/Source/MQTTnet/Server/MqttServerKeepAliveMonitor.cs +++ b/Source/MQTTnet/Server/MqttServerKeepAliveMonitor.cs @@ -29,7 +29,7 @@ namespace MQTTnet.Server // support async/await. Async etc. is avoided here because the thread will usually check // the connections every few milliseconds and thus the context changes (due to async) are // only consuming resources. Also there is just 1 thread for the entire server which is fine at all! - Task.Factory.StartNew(_ => DoWork(cancellationToken), cancellationToken, TaskCreationOptions.LongRunning).Forget(_logger); + Task.Factory.StartNew(_ => DoWork(cancellationToken), cancellationToken, TaskCreationOptions.LongRunning).RunInBackground(_logger); } void DoWork(CancellationToken cancellationToken)