From 14ad81f9ec2bfd5c0f4e06865e8284986ab563a1 Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Mon, 22 Dec 2025 00:44:37 +0100 Subject: [PATCH] Improve disposing of RemoteExecutor --- RemoteExec.Client/RemoteExecutor.cs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/RemoteExec.Client/RemoteExecutor.cs b/RemoteExec.Client/RemoteExecutor.cs index 5154359..abc4dff 100644 --- a/RemoteExec.Client/RemoteExecutor.cs +++ b/RemoteExec.Client/RemoteExecutor.cs @@ -12,15 +12,18 @@ using System.Threading.Channels; namespace RemoteExec.Client; -public class RemoteExecutor : IDisposable +public class RemoteExecutor : IAsyncDisposable { private readonly List servers = []; private readonly BlockingCollection globalQueue = []; private readonly ConcurrentDictionary> pendingResults = new(); + private CancellationTokenSource distributorCts = new(); private Task? distributorTask; + private readonly LoadBalancingStrategy loadBalancingStrategy; private readonly ILogger logger; + private bool disposedValue; public event EventHandler? MetricsUpdated; @@ -313,15 +316,19 @@ public class RemoteExecutor : IDisposable public required DateTime EnqueuedAt { get; init; } } - // S2930: Dispose distributorCts when no longer needed - protected virtual void Dispose(bool disposing) + protected virtual async Task DisposeAsync(bool disposing) { if (!disposedValue) { if (disposing) { distributorCts.Dispose(); - // Dispose managed state (managed objects) here if needed + + foreach (ServerConnection server in servers) + { + await server.Connection.DisposeAsync(); + server.HttpClient.Dispose(); + } } // Free unmanaged resources (unmanaged objects) and override finalizer if needed @@ -331,10 +338,9 @@ public class RemoteExecutor : IDisposable } } - public void Dispose() + public async ValueTask DisposeAsync() { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method - Dispose(disposing: true); + await DisposeAsync(disposing: true); GC.SuppressFinalize(this); } }