unity3d 线程安全问题c#
gui相关的操做必须在Update 里调用,因此通常的解决办法是使用一个隐藏的MonoBehaviour,非UI线程里想作的操做都注册到这个隐藏的MonoBehaviour里安全
using UnityEngine; using System; using System.Collections; using System.Collections.Generic; namespace wlgame { public delegate void GUITask (); public class TaskExecutorScript : MonoBehaviour { private Queue<GUITask> TaskQueue = new Queue<GUITask> (); private object _queueLock = new object (); // Update is called once per frame void Update () { lock (_queueLock) { if (TaskQueue.Count > 0) TaskQueue.Dequeue () (); } } public void ScheduleTask (GUITask newTask) { lock (_queueLock) { if (TaskQueue.Count < 100) TaskQueue.Enqueue (newTask); } } } }
AfterResponseFuntion afterFun = delegate(System.Object result) { taskExecutor.ScheduleTask (new GUITask (delegate { EditorUtility.DisplayDialog ("title", "aaaaaaa", "abc", "edf"); })); }; Communication.SendScore2Server (afterFun);