Unity3D协程和lambda回调,安全性

时间:2018-08-20 15:08:29

标签: c# 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
 }

我担心的是在第一个协程中分配的myBoolMyCoroutine不会等到MyOtherCoroutine完成。我可以看到System.Action不会被收集,因为它确实仍被MyOtherCoroutine引用,但是MyCoroutine(Action修改了布尔变量的那个)应该已经被释放了?

2 个答案:

答案 0 :(得分:2)

  

但这似乎是可能的内存泄漏,这可能是不可能的   赶上以后?只是问是否可以使用它。

没有内存泄漏。这样做完全没问题,如果您需要在协程函数中进行回调,那就应该这样做。请记住,这是C#,与C ++相比,在C#中更难创建内存泄漏,除非您滥用了Unity的某些API,这些API可能在native(C ++)端造成内存泄漏,但这不是这种情况。

尽管,您应该在调用Action之前先检查null是否为if (dangerous_callback != null) dangerous_callback.Invoke(); ,否则在代码中会遇到一些问题。

CommunicationManager

答案 1 :(得分:0)

很快你就可以使用:

dangerous_callback?.Invoke();