From 08b0bc94c4f0f5a11a745981e31bcf3e5a53c5df Mon Sep 17 00:00:00 2001 From: goaaats <16760685+goaaats@users.noreply.github.com> Date: Sat, 4 Dec 2021 15:17:05 +0100 Subject: [PATCH] fix(PluginImageCache): use thread instead of taks --- .../Internal/Windows/PluginImageCache.cs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Dalamud/Interface/Internal/Windows/PluginImageCache.cs b/Dalamud/Interface/Internal/Windows/PluginImageCache.cs index a39b4ed6d..aadf93571 100644 --- a/Dalamud/Interface/Internal/Windows/PluginImageCache.cs +++ b/Dalamud/Interface/Internal/Windows/PluginImageCache.cs @@ -45,6 +45,7 @@ namespace Dalamud.Interface.Internal.Windows private BlockingCollection> downloadQueue = new(); private CancellationTokenSource downloadToken = new(); + private Thread downloadThread; private Dictionary pluginIconMap = new(); private Dictionary pluginImagesMap = new(); @@ -61,11 +62,8 @@ namespace Dalamud.Interface.Internal.Windows this.TroubleIcon = interfaceManager.LoadImage(Path.Combine(dalamud.AssetDirectory.FullName, "UIRes", "troubleIcon.png")); this.UpdateIcon = interfaceManager.LoadImage(Path.Combine(dalamud.AssetDirectory.FullName, "UIRes", "updateIcon.png")); - var task = new Task( - () => this.DownloadTask(this.downloadToken.Token), - this.downloadToken.Token, - TaskCreationOptions.LongRunning); - task.Start(); + this.downloadThread = new Thread(this.DownloadTask); + this.downloadThread.Start(); } /// @@ -91,6 +89,12 @@ namespace Dalamud.Interface.Internal.Windows this.UpdateIcon?.Dispose(); this.downloadToken?.Cancel(); + + if (!this.downloadThread.Join(4000)) + { + Log.Error("Plugin Image Download thread has not cancelled in time."); + } + this.downloadToken?.Dispose(); this.downloadQueue?.CompleteAdding(); this.downloadQueue?.Dispose(); @@ -171,16 +175,13 @@ namespace Dalamud.Interface.Internal.Windows return false; } - private async void DownloadTask(CancellationToken token) + private async void DownloadTask() { - while (true) + while (!this.downloadToken.Token.IsCancellationRequested) { try { - if (token.IsCancellationRequested) - return; - - if (!this.downloadQueue.TryTake(out var task, -1, token)) + if (!this.downloadQueue.TryTake(out var task, -1, this.downloadToken.Token)) return; await task.Invoke();