当我尝试调试多线程应用程序时,Unity编辑器冻结

时间:2018-11-07 04:35:14

标签: c# multithreading debugging unity3d asynchronous

每当我将调试器附加到统一编辑器时,只要按下运行按钮,该编辑器就会冻结。

从服务器收到数据包后,我尝试运行一个异步任务,该任务在实现MonoBehavior的“屏幕”脚本上调用静态方法

public override async Task RunImpl()
{
    LoginScreen.UpdateSrvText();
}

LoginScreen看起来如下

public class LoginScreen : MonoBehaviour
{
    private static LoginScreen instance = null;

    public TextMeshProUGUI ServerResponseText;
    private NetworkClient Client;
    private static List<System.Action> actionQueuesUpdateFunc = new List<Action>();
    private volatile static bool noActionQueueToExecuteUpdateFunc = true;
    List<System.Action> actionCopiedQueueUpdateFunc = new List<System.Action>();

    void Awake()
    {
        instance = this;
        DontDestroyOnLoad(gameObject);
    }

    void Start()
    {
        Client = GlobalControl.Instance.NetworkingClient = new NetworkClient();
    }

    void Update()
    {
        ProcessUpdateQueue();
    }

    public static void UpdateSrvText()
    {
        instance.UpdateSrc();
    }

    public void UpdateSrc()
    {
        ExecuteInUpdate(() =>
        {
            ServerResponseText.text = GlobalControl.Instance.LoginScreenServerText;
        });
    }

    public static void ExecuteInUpdate(System.Action action)
    {
        if (action == null)
        {
            throw new ArgumentNullException("action");
        }

        lock (actionQueuesUpdateFunc)
        {
            actionQueuesUpdateFunc.Add(action);
            noActionQueueToExecuteUpdateFunc = false;
        }
    }

    private void ProcessUpdateQueue()
    {
        if (noActionQueueToExecuteUpdateFunc)
        {
            return;
        }

        actionCopiedQueueUpdateFunc.Clear();
        lock (actionQueuesUpdateFunc)
        {
            actionCopiedQueueUpdateFunc.AddRange(actionQueuesUpdateFunc);
            actionQueuesUpdateFunc.Clear();
            noActionQueueToExecuteUpdateFunc = true;
        }

        for (int i = 0; i < actionCopiedQueueUpdateFunc.Count; i++)
        {
            actionCopiedQueueUpdateFunc[i].Invoke();
        }
    }
}

启动应用程序后,我尝试附加调试器,但随后Visual Studio冻结,并关闭了编辑器。我正在尝试重用我在一个较常见的问题中找到的有关在主线程上实现简单队列的代码,并且除调试器外,该代码都可以正常工作。

0 个答案:

没有答案