diff --git a/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs b/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs index 029c7aa..5f47491 100644 --- a/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs +++ b/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs @@ -77,9 +77,9 @@ namespace YooAsset internal void SetFinish() { Progress = 1f; - _callback?.Invoke(this); if (_taskCompletionSource != null) _taskCompletionSource.TrySetResult(null); + _callback?.Invoke(this); } internal void SetStart() { diff --git a/Assets/YooAsset/Runtime/OperationSystem/OperationSystem.cs b/Assets/YooAsset/Runtime/OperationSystem/OperationSystem.cs index ff416d9..0cf15b7 100644 --- a/Assets/YooAsset/Runtime/OperationSystem/OperationSystem.cs +++ b/Assets/YooAsset/Runtime/OperationSystem/OperationSystem.cs @@ -7,8 +7,7 @@ namespace YooAsset internal class OperationSystem { private static readonly List _operations = new List(100); - private static readonly List _addList = new List(100); - private static readonly List _removeList = new List(100); + private static readonly List _newList = new List(100); // 计时器相关 private static Stopwatch _watch; @@ -47,39 +46,26 @@ namespace YooAsset _frameTime = _watch.ElapsedMilliseconds; // 添加新的异步操作 - if (_addList.Count > 0) + if (_newList.Count > 0) { - for (int i = 0; i < _addList.Count; i++) - { - var operation = _addList[i]; - _operations.Add(operation); - } - _addList.Clear(); + _operations.AddRange(_newList); + _newList.Clear(); } // 更新所有的异步操作 - foreach (var operation in _operations) + for (int i = _operations.Count - 1; i >= 0; i--) { if (IsBusy) break; + var operation = _operations[i]; operation.Update(); if (operation.IsDone) { - _removeList.Add(operation); - operation.SetFinish(); + _operations.RemoveAt(i); + operation.SetFinish(); //注意:如果业务端发生异常,保证异步操作提前移除。 } } - - // 移除已经完成的异步操作 - if (_removeList.Count > 0) - { - foreach (var operation in _removeList) - { - _operations.Remove(operation); - } - _removeList.Clear(); - } } /// @@ -88,8 +74,7 @@ namespace YooAsset public static void DestroyAll() { _operations.Clear(); - _addList.Clear(); - _removeList.Clear(); + _newList.Clear(); _watch = null; _frameTime = 0; MaxTimeSlice = long.MaxValue; @@ -100,7 +85,7 @@ namespace YooAsset /// public static void StartOperation(AsyncOperationBase operation) { - _addList.Add(operation); + _newList.Add(operation); operation.SetStart(); operation.Start(); }