Unity3D 协程和 lambda 回调,安全

调用在协程中声明的 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 修改的布尔变量)应该已经被释放了?


杨魅力
浏览 213回答 2
2回答

慕少森

但这似乎是一个可能的内存泄漏,以后可能无法发现?就问能不能用。没有内存泄漏。这样做完全没问题,如果您需要在协程函数中进行回调,那就应该这样做。请记住,这是 C# 并且在 C# 中创建内存泄漏比在 C++ 中更难,除非您滥用了一些 Unity 的 API,这些 API 可以在本机(C++)端创建内存泄漏,但这里的情况并非如此。虽然,你应该检查是否Action是null调用它,否则之前,期望在你的代码的一些问题。if (dangerous_callback != null)     dangerous_callback.Invoke();

炎炎设计

很快你就可以使用:dangerous_callback?.Invoke();
打开App,查看更多内容
随时随地看视频慕课网APP