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