diff --git a/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs b/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs index 793ffca8..457a4f8a 100644 --- a/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs +++ b/Assets/YooAsset/Runtime/OperationSystem/AsyncOperationBase.cs @@ -188,11 +188,19 @@ namespace YooAsset // 结束记录 DebugEndRecording(); - //注意:如果完成回调内发生异常,会导致Task无限期等待 - _callback?.Invoke(this); - - if (_taskCompletionSource != null) - _taskCompletionSource.TrySetResult(null); + try + { + _callback?.Invoke(this); + } + catch (Exception ex) + { + YooLogger.Error($"Exception in completion callback: {ex}"); + } + finally + { + if (_taskCompletionSource != null) + _taskCompletionSource.TrySetResult(null); + } } } diff --git a/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs b/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs index 462eaeff..0904e2d1 100644 --- a/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs +++ b/Assets/YooAsset/Runtime/ResourceManager/Provider/ProviderOperation.cs @@ -269,6 +269,7 @@ namespace YooAsset if (_resManager.UseWeakReferenceHandle) { + // TODO 高危风险:如果移除弱引用失败,会导致资源永远无法释放。 if (RemoveWeakReference(handle) == false) throw new System.Exception("Should never get here !"); } @@ -335,11 +336,18 @@ namespace YooAsset List> tempers = _weakReferences.ToList(); foreach (var weakRef in tempers) { - if (weakRef.TryGetTarget(out HandleBase target)) + if (weakRef.TryGetTarget(out HandleBase handle)) { - if (target.IsValid) + if (handle.IsValid) { - target.InvokeCallback(); + try + { + handle.InvokeCallback(); + } + catch (Exception ex) + { + YooLogger.Error($"Exception in completion callback: {ex}"); + } } } } @@ -351,7 +359,14 @@ namespace YooAsset { if (handle.IsValid) { - handle.InvokeCallback(); + try + { + handle.InvokeCallback(); + } + catch (Exception ex) + { + YooLogger.Error($"Exception in completion callback: {ex}"); + } } } }