QSBWorldSync: simplify async

This commit is contained in:
JohnCorby 2022-02-14 22:51:09 -08:00
parent 4680911cac
commit 01e1acfc0f

View File

@ -29,8 +29,8 @@ namespace QSB.WorldSync
public static bool AllObjectsReady { get; private set; } public static bool AllObjectsReady { get; private set; }
private static CancellationTokenSource _cts; private static CancellationTokenSource _cts;
private static readonly Dictionary<WorldObjectManager, UniTask> _managersBuilding = new(); private static readonly List<UniTask> _managerTasks = new();
private static readonly Dictionary<IWorldObject, UniTask> _objectsIniting = new(); private static readonly List<UniTask> _objectTasks = new();
public static async UniTaskVoid BuildWorldObjects(OWScene scene) public static async UniTaskVoid BuildWorldObjects(OWScene scene)
{ {
@ -59,26 +59,21 @@ namespace QSB.WorldSync
continue; continue;
} }
var task = UniTask.Create(async () => var task = manager.Try("building world objects", async () =>
{ {
await manager.Try("building world objects", async () => await manager.BuildWorldObjects(scene, _cts.Token);
{ DebugLog.DebugWrite($"Built {manager}", MessageType.Info);
await manager.BuildWorldObjects(scene, _cts.Token);
DebugLog.DebugWrite($"Built {manager}", MessageType.Info);
});
_managersBuilding.Remove(manager);
}); });
if (!task.Status.IsCompleted()) _managerTasks.Add(task);
{
_managersBuilding.Add(manager, task);
}
} }
await _managersBuilding.Values; await _managerTasks;
_managerTasks.Clear();
AllObjectsAdded = true; AllObjectsAdded = true;
DebugLog.DebugWrite("World Objects added.", MessageType.Success); DebugLog.DebugWrite("World Objects added.", MessageType.Success);
await _objectsIniting.Values; await _objectTasks;
_objectTasks.Clear();
AllObjectsReady = true; AllObjectsReady = true;
DebugLog.DebugWrite("World Objects ready.", MessageType.Success); DebugLog.DebugWrite("World Objects ready.", MessageType.Success);
@ -97,22 +92,24 @@ namespace QSB.WorldSync
return; return;
} }
var count = _managerTasks.Count(x => !x.Status.IsCompleted());
if (count > 0)
{
DebugLog.DebugWrite($"{count} managers still building", MessageType.Warning);
}
count = _objectTasks.Count(x => !x.Status.IsCompleted());
if (count > 0)
{
DebugLog.DebugWrite($"{count} objects still initing", MessageType.Warning);
}
_cts.Cancel(); _cts.Cancel();
_cts.Dispose(); _cts.Dispose();
_cts = null; _cts = null;
if (_managersBuilding.Count > 0) _managerTasks.Clear();
{ _objectTasks.Clear();
DebugLog.DebugWrite($"{_managersBuilding.Count} managers still building", MessageType.Warning);
}
if (_objectsIniting.Count > 0)
{
DebugLog.DebugWrite($"{_objectsIniting.Count} objects still initing", MessageType.Warning);
}
_managersBuilding.Clear();
_objectsIniting.Clear();
AllObjectsAdded = false; AllObjectsAdded = false;
AllObjectsReady = false; AllObjectsReady = false;
@ -299,15 +296,8 @@ namespace QSB.WorldSync
WorldObjects.Add(worldObject); WorldObjects.Add(worldObject);
UnityObjectsToWorldObjects.Add(unityObject, worldObject); UnityObjectsToWorldObjects.Add(unityObject, worldObject);
var task = UniTask.Create(async () => var task = worldObject.Try("initing", () => worldObject.Init(_cts.Token));
{ _objectTasks.Add(task);
await worldObject.Try("initing", () => worldObject.Init(_cts.Token));
_objectsIniting.Remove(worldObject);
});
if (!task.Status.IsCompleted())
{
_objectsIniting.Add(worldObject, task);
}
} }
public static void SetDialogueCondition(string name, bool state) public static void SetDialogueCondition(string name, bool state)