diff --git a/MareSynchronos/Interop/IpcManager.cs b/MareSynchronos/Interop/IpcManager.cs index 1466f06..a134c5e 100644 --- a/MareSynchronos/Interop/IpcManager.cs +++ b/MareSynchronos/Interop/IpcManager.cs @@ -260,10 +260,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase }).ConfigureAwait(false); } - public string GetCustomizePlusScale() + public async Task GetCustomizePlusScale() { if (!CheckCustomizePlusApi()) return string.Empty; - var scale = _customizePlusGetBodyScale.InvokeFunc(_dalamudUtil.PlayerName); + var scale = await _dalamudUtil.RunOnFrameworkThread(() => _customizePlusGetBodyScale.InvokeFunc(_dalamudUtil.PlayerName)).ConfigureAwait(false); if (string.IsNullOrEmpty(scale)) return string.Empty; return Convert.ToBase64String(Encoding.UTF8.GetBytes(scale)); } @@ -310,7 +310,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase } } - public string GlamourerGetCharacterCustomization(IntPtr character) + public async Task GlamourerGetCharacterCustomization(IntPtr character) { if (!CheckGlamourerApi()) return string.Empty; try @@ -318,7 +318,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase var gameObj = _dalamudUtil.CreateGameObject(character); if (gameObj is Character c) { - var glamourerString = _glamourerGetAllCustomization!.InvokeFunc(c); + var glamourerString = await _dalamudUtil.RunOnFrameworkThread(() => _glamourerGetAllCustomization!.InvokeFunc(c)).ConfigureAwait(false); byte[] bytes = Convert.FromBase64String(glamourerString); // ignore transparency bytes[88] = 128; @@ -361,10 +361,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase }).ConfigureAwait(false); } - public string PalettePlusBuildPalette() + public async Task PalettePlusBuildPalette() { if (!CheckPalettePlusApi()) return string.Empty; - var palette = _palettePlusBuildCharaPalette.InvokeFunc(_dalamudUtil.PlayerCharacter); + var palette = await _dalamudUtil.RunOnFrameworkThread(() => _palettePlusBuildCharaPalette.InvokeFunc(_dalamudUtil.PlayerCharacter)).ConfigureAwait(false); if (string.IsNullOrEmpty(palette)) return string.Empty; return Convert.ToBase64String(Encoding.UTF8.GetBytes(palette)); } @@ -434,9 +434,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase logger.LogTrace("[{applicationId}] RemoveTemporaryCollection: {ret2}", applicationId, ret2); } - public (string[] forward, string[][] reverse) PenumbraResolvePaths(string[] forward, string[] reverse) + public async Task<(string[] forward, string[][] reverse)> PenumbraResolvePaths(string[] forward, string[] reverse) { - return _penumbraResolvePaths.Invoke(forward, reverse); + return await _dalamudUtil.RunOnFrameworkThread(() => _penumbraResolvePaths.Invoke(forward, reverse)); } public void PenumbraSetTemporaryMods(ILogger logger, Guid applicationId, string characterName, int? idx, Dictionary modPaths, string manipulationData) diff --git a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs index b0a7019..6eb152c 100644 --- a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs @@ -323,9 +323,9 @@ public class PlayerDataFactory // gather up data from ipc previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations(); previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); - Task getGlamourerData = Task.Run(() => _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address)); - Task getCustomizeData = Task.Run(_ipcManager.GetCustomizePlusScale); - Task getPalettePlusData = Task.Run(_ipcManager.PalettePlusBuildPalette); + Task getGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(playerRelatedObject.Address); + Task getCustomizeData = _ipcManager.GetCustomizePlusScale(); + Task getPalettePlusData = _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); @@ -335,7 +335,7 @@ public class PlayerDataFactory // gather static replacements from render model var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token); - Dictionary> resolvedPaths = GetFileReplacementsFromPaths(forwardResolve, reverseResolve); + Dictionary> resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false); previousData.FileReplacements[objectKind] = new HashSet(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) .Where(p => p.HasFileReplacement).ToHashSet(); @@ -363,7 +363,7 @@ public class PlayerDataFactory // get all remaining paths and resolve them var transientPaths = ManageSemiTransientData(objectKind, charaPointer); - var resolvedTransientPaths = GetFileReplacementsFromPaths(transientPaths, new HashSet(StringComparer.Ordinal)); + var resolvedTransientPaths = await GetFileReplacementsFromPaths(transientPaths, new HashSet(StringComparer.Ordinal)).ConfigureAwait(false); _logger.LogDebug("== Transient Replacements =="); foreach (var replacement in resolvedTransientPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)).OrderBy(f => f.ResolvedPath, StringComparer.Ordinal)) @@ -387,12 +387,12 @@ public class PlayerDataFactory return previousData; } - private Dictionary> GetFileReplacementsFromPaths(HashSet forwardResolve, HashSet reverseResolve) + private async Task>> GetFileReplacementsFromPaths(HashSet forwardResolve, HashSet reverseResolve) { var forwardPaths = forwardResolve.ToArray(); var reversePaths = reverseResolve.ToArray(); Dictionary> resolvedPaths = new(StringComparer.Ordinal); - var (forward, reverse) = _ipcManager.PenumbraResolvePaths(forwardPaths, reversePaths); + var (forward, reverse) = await _ipcManager.PenumbraResolvePaths(forwardPaths, reversePaths).ConfigureAwait(false); for (int i = 0; i < forwardPaths.Length; i++) { var filePath = forward[i].ToLowerInvariant(); diff --git a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs index 968abe8..e79859c 100644 --- a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs +++ b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs @@ -113,20 +113,20 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase return true; } - public void Initialize(string name) + public async Task Initialize(string name) { PlayerName = name; _charaHandler = _gameObjectHandlerFactory(ObjectKind.Player, () => _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName)?.Address ?? IntPtr.Zero, false); - _originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter); + _originalGlamourerData = await _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter).ConfigureAwait(false); _lastGlamourerData = _originalGlamourerData; Mediator.Subscribe(this, IpcManagerOnPenumbraRedrawEvent); - Mediator.Subscribe(this, (msg) => + Mediator.Subscribe(this, async (msg) => { if (msg.GameObjectHandler == _charaHandler && (_applicationTask?.IsCompleted ?? true)) { Logger.LogTrace("Saving new Glamourer Data for {this}", this); - _lastGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter); + _lastGlamourerData = await _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter).ConfigureAwait(false); } }); diff --git a/MareSynchronos/WebAPI/Files/FileUploadManager.cs b/MareSynchronos/WebAPI/Files/FileUploadManager.cs index d27f352..b1fc262 100644 --- a/MareSynchronos/WebAPI/Files/FileUploadManager.cs +++ b/MareSynchronos/WebAPI/Files/FileUploadManager.cs @@ -183,7 +183,14 @@ public sealed class FileUploadManager : DisposableMediatorSubscriberBase Progress prog = new((prog) => { - CurrentUploads.Single(f => string.Equals(f.Hash, fileHash, StringComparison.Ordinal)).Transferred = prog.Uploaded; + try + { + CurrentUploads.Single(f => string.Equals(f.Hash, fileHash, StringComparison.Ordinal)).Transferred = prog.Uploaded; + } + catch (Exception ex) + { + Logger.LogWarning(ex, "[{hash}] Could not set upload progress", fileHash); + } }); var streamContent = new ProgressableStreamContent(ms, prog); streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");