Action <t>和Func <t>是否作为强引用传递?</t> </t>

时间:2015-01-04 04:42:12

标签: c# callback strong-references

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

0 个答案:

没有答案