From 7c2e969cf1432a95f08b9dd87954e259e7dff543 Mon Sep 17 00:00:00 2001 From: Igor Milavec Date: Mon, 22 Nov 2021 15:44:28 +0100 Subject: [PATCH 1/2] Fix Thread pool exhaustion due to MessageListener running on ThreadPool --- src/Renci.SshNet/Session.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Renci.SshNet/Session.cs b/src/Renci.SshNet/Session.cs index 0748b8dac..d2bf4bdf1 100644 --- a/src/Renci.SshNet/Session.cs +++ b/src/Renci.SshNet/Session.cs @@ -618,7 +618,8 @@ public void Connect() _messageListenerCompleted.Reset(); // Start incoming request listener - ThreadAbstraction.ExecuteThread(() => MessageListener()); + // ToDo: Make message pump async, to not consume a thread for every session + ThreadAbstraction.ExecuteThreadLongRunning(() => MessageListener()); // Wait for key exchange to be completed WaitOnHandle(_keyExchangeCompletedWaitHandle); From 01c6a87afeec4aa98d6b21e5d0ab6ccd421afb5f Mon Sep 17 00:00:00 2001 From: Igor Milavec Date: Mon, 22 Nov 2021 15:44:36 +0100 Subject: [PATCH 2/2] Mark long running thread as background --- src/Renci.SshNet/Abstractions/ThreadAbstraction.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Renci.SshNet/Abstractions/ThreadAbstraction.cs b/src/Renci.SshNet/Abstractions/ThreadAbstraction.cs index ee21ec7ef..8c344404b 100644 --- a/src/Renci.SshNet/Abstractions/ThreadAbstraction.cs +++ b/src/Renci.SshNet/Abstractions/ThreadAbstraction.cs @@ -21,12 +21,17 @@ public static void Sleep(int millisecondsTimeout) public static void ExecuteThreadLongRunning(Action action) { + if (action == null) + throw new ArgumentNullException("action"); + #if FEATURE_THREAD_TAP var taskCreationOptions = System.Threading.Tasks.TaskCreationOptions.LongRunning; System.Threading.Tasks.Task.Factory.StartNew(action, taskCreationOptions); #else - var thread = new System.Threading.Thread(() => action()); - thread.Start(); + new System.Threading.Thread(() => action()) + { + IsBackground = true + }.Start(); #endif }