diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index ebadd22..f40c394 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -145,18 +145,14 @@ public class CharacterDataFactory : MediatorSubscriberBase // gather up data from ipc previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations(); previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); - Task getGlamourerData = new(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address)); - _processingQueue.Enqueue(getGlamourerData); - Task getCustomizeData = new(() => _ipcManager.GetCustomizePlusScale()); - _processingQueue.Enqueue(getCustomizeData); - Task getPalettePlusData = new(() => _ipcManager.PalettePlusBuildPalette()); - _processingQueue.Enqueue(getPalettePlusData); - Task.WaitAll(new[] { getGlamourerData, getCustomizeData, getPalettePlusData }, token); - previousData.GlamourerString[playerRelatedObject.ObjectKind] = await getGlamourerData.ConfigureAwait(true); - previousData.CustomizePlusScale = await getCustomizeData.ConfigureAwait(true); - previousData.PalettePlusPalette = await getPalettePlusData.ConfigureAwait(true); + Task getGlamourerData = Task.Run(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address)); + Task getCustomizeData = Task.Run(() => _ipcManager.GetCustomizePlusScale()); + Task getPalettePlusData = Task.Run(() => _ipcManager.PalettePlusBuildPalette()); + previousData.GlamourerString[playerRelatedObject.ObjectKind] = await getGlamourerData.ConfigureAwait(false); _logger.LogDebug("Glamourer is now: {data}", previousData.GlamourerString[playerRelatedObject.ObjectKind]); + previousData.CustomizePlusScale = await getCustomizeData.ConfigureAwait(false); _logger.LogDebug("Customize is now: {data}", previousData.CustomizePlusScale); + previousData.PalettePlusPalette = await getPalettePlusData.ConfigureAwait(false); _logger.LogDebug("Palette is now: {data}", previousData.PalettePlusPalette); // gather static replacements from render model diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index a659368..932d6bb 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -390,7 +390,7 @@ public class CachedPlayer : MediatorSubscriberBase, IDisposable } } - while (!_applicationTask?.IsCompleted ?? false) + while (!_applicationTask?.IsCompleted ?? false && !downloadToken.IsCancellationRequested) { // block until current application is done _logger.LogDebug("Waiting for current data application (Id: {id}) to finish", _applicationId); @@ -416,15 +416,12 @@ public class CachedPlayer : MediatorSubscriberBase, IDisposable _logger.LogDebug("[{applicationId}] Application finished", _applicationId); }); - }, downloadToken).ContinueWith(task => - { - _downloadCancellationTokenSource = null; + _downloadCancellationTokenSource = null; - if (!task.IsCanceled) return; + _logger.LogDebug("Download was cancelled"); + _apiController.CancelDownload(downloadId); - _logger.LogDebug("Download was cancelled"); - _apiController.CancelDownload(downloadId); - }); + }, downloadToken); } private Task? _applicationTask; diff --git a/MareSynchronos/Models/GameObjectHandler.cs b/MareSynchronos/Models/GameObjectHandler.cs index a27d162..68d2297 100644 --- a/MareSynchronos/Models/GameObjectHandler.cs +++ b/MareSynchronos/Models/GameObjectHandler.cs @@ -124,7 +124,7 @@ public class GameObjectHandler : MediatorSubscriberBase || (((GameObject*)curPtr)->RenderFlags & 0b100000000000) == 0b100000000000; } - public async Task IsBeingDrawn() + public async Task IsBeingDrawnRunOnFramework() { return await _dalamudUtil.RunOnFrameworkThread(() => { diff --git a/MareSynchronos/Utils/DalamudUtil.cs b/MareSynchronos/Utils/DalamudUtil.cs index ea9c90c..ef9225b 100644 --- a/MareSynchronos/Utils/DalamudUtil.cs +++ b/MareSynchronos/Utils/DalamudUtil.cs @@ -254,11 +254,13 @@ public class DalamudUtil : IDisposable public async Task RunOnFrameworkThread(Action act) { + _logger.LogTrace("Running Action on framework thread: {act}", act); await _framework.RunOnFrameworkThread(act).ConfigureAwait(false); } public async Task RunOnFrameworkThread(Func func) { + _logger.LogTrace("Running Func on framework thread: {func}", func); return await _framework.RunOnFrameworkThread(func).ConfigureAwait(false); } @@ -275,11 +277,11 @@ public class DalamudUtil : IDisposable // ReSharper disable once LoopVariableIsNeverChangedInsideLoop while ((!ct?.IsCancellationRequested ?? true) && curWaitTime < timeOut - && await handler.IsBeingDrawn().ConfigureAwait(false)) // 0b100000000000 is "still rendering" or something + && await handler.IsBeingDrawnRunOnFramework().ConfigureAwait(true)) // 0b100000000000 is "still rendering" or something { logger.LogTrace($"[{redrawId}] Waiting for {handler} to finish drawing"); curWaitTime += tick; - Thread.Sleep(tick); + await Task.Delay(tick).ConfigureAwait(true); } logger.LogTrace($"[{redrawId}] Finished drawing after {curWaitTime}ms");