为了账号安全,请及时绑定邮箱和手机立即绑定

Unity3D 协程和 lambda 回调,安全

Unity3D 协程和 lambda 回调,安全

C#
杨魅力 2021-12-05 16:50:47
调用在协程中声明的 System.Action 是否安全?IEnumerator MyCoroutine(){     bool myBool = true;     System.Action action = ()=>{myBool=false;}     StartCoroutine (MyOtherCoroutine(action));//just launch and forget about it } IEnumerator MyOtherCoroutine(System.Action dangerous_callback){     yield return null;     yield return null;//skip several frames     yield return null;     dangerous_callback.Invoke();//will cause problems? The owner coroutine (and it's myBool) is no longer on stack }我担心的是myBool在第一个协程中分配的。MyCoroutine不等到MyOtherCoroutine完成。我可以看到 System.Action 不会被收集,因为它确实仍然被 引用MyOtherCoroutine,但是MyCoroutine(Action 修改的布尔变量)应该已经被释放了?
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

但这似乎是一个可能的内存泄漏,以后可能无法发现?就问能不能用。

没有内存泄漏。这样做完全没问题,如果您需要在协程函数中进行回调,那就应该这样做。请记住,这是 C# 并且在 C# 中创建内存泄漏比在 C++ 中更难,除非您滥用了一些 Unity 的 API,这些 API 可以在本机(C++)端创建内存泄漏,但这里的情况并非如此。

虽然,你应该检查是否Actionnull调用它,否则之前,期望在你的代码的一些问题。

if (dangerous_callback != null)
    dangerous_callback.Invoke();


查看完整回答
反对 回复 2021-12-05
?
炎炎设计

TA贡献1808条经验 获得超4个赞

很快你就可以使用:

dangerous_callback?.Invoke();


查看完整回答
反对 回复 2021-12-05
  • 2 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信