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();