我在游戏类上有一个注册回调方法,当游戏关闭时,对象可以注册回调。
public void RegisterAsyncShutdownCallback(Func<Task> callback)
{
if (this.asyncShutdownCallbacks.Contains(callback))
{
return;
}
this.asyncShutdownCallbacks.Add(callback);
}
当游戏关闭时,我调用回调。
public virtual async Task ShutdownGame()
{
var callbackTasks = new List<Task>();
foreach (var callback in this.asyncShutdownCallbacks)
{
callbackTasks.Add(callback());
}
// Invoke all of the asynchronous callbacks first.
await Task.WhenAll(callbackTasks);
}
我的问题是,如果这些回调之一的所有者变为 null,因为怪物死亡或项目被设置为 null 等,我是否持有对回调所有者的强引用?如果是这样,提供注销方法是更好的做法还是应该将它们包装在 WeakReference 中?
引擎使用回调代替事件,因此我可以在玩家、怪物、战斗代码等中执行异步操作。所以我的很多对象都有这种 RegisterCallback 方法,并在对象内发生某些事件时调用回调。如果我持有一个强引用,我宁愿持有一个弱引用并自我清理,而不是依赖于正确取消注册的对象。该引擎提供了一个 API,允许第 3 方用户创建插件和注册回调。如果我可以在引擎本身内控制它,我不想依赖开发人员正确注销对象。