0

我在游戏类上有一个注册回调方法,当游戏关闭时,对象可以注册回调。

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 方用户创建插件和注册回调。如果我可以在引擎本身内控制它,我不想依赖开发人员正确注销对象。

4

0 回答 0