diff --git a/MultiTerm.Core/ViewModel/ITerminalViewModel.cs b/MultiTerm.Core/ViewModel/ITerminalViewModel.cs
index 4f90d37..5b76cff 100644
--- a/MultiTerm.Core/ViewModel/ITerminalViewModel.cs
+++ b/MultiTerm.Core/ViewModel/ITerminalViewModel.cs
@@ -36,6 +36,12 @@ public interface ITerminalViewModel
///
void CloseRequest();
+ ///
+ /// Force close the Terminal and disconnect communication protocol.
+ /// Does not raise .
+ ///
+ void ForceClose();
+
///
/// Closing of Terminal was initiated.
///
diff --git a/MultiTerm.Core/ViewModel/ShellViewModel.cs b/MultiTerm.Core/ViewModel/ShellViewModel.cs
index bfa1a27..a65d4c1 100644
--- a/MultiTerm.Core/ViewModel/ShellViewModel.cs
+++ b/MultiTerm.Core/ViewModel/ShellViewModel.cs
@@ -68,6 +68,20 @@ public partial class ShellViewModel : ObservableObject, IRecipient
+ /// Forcefully close all s.
+ ///
+ public void Teardown()
+ {
+ // iterate through all terminals
+ foreach (ITerminalViewModel terminal in this.TerminalViewModels)
+ {
+ // forcefully close
+ terminal.ForceClose();
+ // do not remove from collection, otherwise the collection was changed
+ }
+ }
+
[RelayCommand]
private void AppendTerminalWithSelectedViewType(ProtocolType protocolType)
{
@@ -75,7 +89,6 @@ public partial class ShellViewModel : ObservableObject, IRecipient();
appSettingsProvider.Save();
+ // teardown of terminal views and communication protocol threads
+ var shellViewModel = AppHost!.Services.GetRequiredService();
+ shellViewModel.Teardown();
+
// log application exit and stop logger (if still available)
logger?.LogInfo("Application exited.", nameof(App));
logger?.StopLogging();