From cf6ec29d8a7882db15feb71f9f86063c33fb1e78 Mon Sep 17 00:00:00 2001 From: Ziya Suzen Date: Fri, 7 Mar 2025 12:50:14 +0000 Subject: [PATCH] Fix task tracking Keep a reference to long-running task to avoid potential GC. --- src/NATS.Client.Core/NatsConnection.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/NATS.Client.Core/NatsConnection.cs b/src/NATS.Client.Core/NatsConnection.cs index 267dc7238..3bdc03468 100644 --- a/src/NATS.Client.Core/NatsConnection.cs +++ b/src/NATS.Client.Core/NatsConnection.cs @@ -61,6 +61,8 @@ public partial class NatsConnection : INatsConnection private TimeSpan _backoff = TimeSpan.Zero; private string _lastAuthError = string.Empty; private bool _stopRetries; + private Task? _publishEventsTask; + private Task? _reconnectLoopTask; public NatsConnection() : this(NatsOpts.Default) @@ -97,7 +99,7 @@ public NatsConnection(NatsOpts opts) SingleWriter = false, SingleReader = true, }); - _ = Task.Run(PublishEventsAsync, _disposedCancellationTokenSource.Token); + _publishEventsTask = Task.Run(PublishEventsAsync, _disposedCancellationTokenSource.Token); } // events @@ -410,7 +412,7 @@ private async ValueTask InitialConnectAsync() _pingTimerCancellationTokenSource = new CancellationTokenSource(); StartPingTimer(_pingTimerCancellationTokenSource.Token); _waitForOpenConnection.TrySetResult(); - _ = Task.Run(ReconnectLoop); + _reconnectLoopTask = Task.Run(ReconnectLoop); _eventChannel.Writer.TryWrite((NatsEvent.ConnectionOpened, new NatsEventArgs(url?.ToString() ?? string.Empty))); } } @@ -709,7 +711,7 @@ private async void ReconnectLoop() _pingTimerCancellationTokenSource = new CancellationTokenSource(); StartPingTimer(_pingTimerCancellationTokenSource.Token); _waitForOpenConnection.TrySetResult(); - _ = Task.Run(ReconnectLoop); + _reconnectLoopTask = Task.Run(ReconnectLoop); _eventChannel.Writer.TryWrite((NatsEvent.ConnectionOpened, new NatsEventArgs(url.ToString()))); } } @@ -796,7 +798,7 @@ private async Task PublishEventsAsync() { _logger.LogError(NatsLogEvents.Connection, ex, "Error occured when publishing events"); if (!_disposedCancellationTokenSource.IsCancellationRequested) - _ = Task.Run(PublishEventsAsync, _disposedCancellationTokenSource.Token); + _publishEventsTask = Task.Run(PublishEventsAsync, _disposedCancellationTokenSource.Token); } }