From a44d43eefc7a98c52330a685a941284893569bed Mon Sep 17 00:00:00 2001 From: Oleksii Holub <1935960+Tyrrrz@users.noreply.github.com> Date: Sat, 9 Apr 2022 03:17:30 +0300 Subject: [PATCH] Use a lock when opening dialogs --- .../ViewModels/Framework/DialogManager.cs | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/DiscordChatExporter.Gui/ViewModels/Framework/DialogManager.cs b/DiscordChatExporter.Gui/ViewModels/Framework/DialogManager.cs index 4ad1ed9..d6902d2 100644 --- a/DiscordChatExporter.Gui/ViewModels/Framework/DialogManager.cs +++ b/DiscordChatExporter.Gui/ViewModels/Framework/DialogManager.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Threading; using System.Threading.Tasks; using MaterialDesignThemes.Wpf; using Microsoft.Win32; @@ -8,9 +9,10 @@ using Stylet; namespace DiscordChatExporter.Gui.ViewModels.Framework; -public class DialogManager +public class DialogManager : IDisposable { private readonly IViewManager _viewManager; + private readonly SemaphoreSlim _dialogLock = new(1, 1); public DialogManager(IViewManager viewManager) { @@ -21,20 +23,26 @@ public class DialogManager { var view = _viewManager.CreateAndBindViewForModelIfNecessary(dialogScreen); - void OnDialogOpened(object? sender, DialogOpenedEventArgs openArgs) + void OnDialogOpened(object? openSender, DialogOpenedEventArgs openArgs) { - void OnScreenClosed(object? o, EventArgs closeArgs) + void OnScreenClosed(object? closeSender, EventArgs args) { openArgs.Session.Close(); dialogScreen.Closed -= OnScreenClosed; } - dialogScreen.Closed += OnScreenClosed; } - await DialogHost.Show(view, OnDialogOpened); - - return dialogScreen.DialogResult; + await _dialogLock.WaitAsync(); + try + { + await DialogHost.Show(view, OnDialogOpened); + return dialogScreen.DialogResult; + } + finally + { + _dialogLock.Release(); + } } public string? PromptSaveFilePath(string filter = "All files|*.*", string defaultFilePath = "") @@ -59,4 +67,9 @@ public class DialogManager return dialog.ShowDialog() == true ? dialog.SelectedPath : null; } + + public void Dispose() + { + _dialogLock.Dispose(); + } } \ No newline at end of file