我在Game类上有一个Register Callback方法,对象可以在游戏关闭时注册回调。
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,允许第三方用户创建插件并注册回调。如果我可以在引擎本身内控制它,我不想依赖开发者正确注销对象。