Редактор Unity зависает при попытке отладки многопоточного приложения - PullRequest
0 голосов
/ 07 ноября 2018

Всякий раз, когда я присоединяю отладчик к редактору Unity, редактор просто останавливается, как только я нажимаю кнопку запуска.

При получении пакета с моего сервера я пытаюсь запустить асинхронную задачу, которая вызывает статический метод на моем «экранном» скрипте, который реализует 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 зависает и редактор. Я пытаюсь повторно использовать код, который я нашел в одном из наиболее популярных здесь вопросов о внедрении простой очереди в основной поток, и он работает, за исключением отладчика.

...