Модификация UI элементов не в основном потоке Unity
В настоящее время я активно изучаю и использую Unity для разработки проекта с AR и столкнулся с классической проблемой "модификации UI элементов не в основном потоке" - так делать нельзя, поскольку средой будет вызвано исключение UnityException.
В рамках изучения этого вопроса я далеко не сразу нашёл решение. Передо мной стояла задача сделать обработку сообщения, получаемого по каналу связи через WebSocket, изменив при этом некоторые UI элементы. Обработка происходит не в основном потоке.
Через некоторое время я наткнулся на одно из возможных решений этой проблемы через очередь задач, которая решает данную проблему:
// Экземпляр WebSocket
private WebSocket _ws;
// Очередь команд для обработки
private readonly ConcurrentQueue<Action> _actions = new ConcurrentQueue<Action>();
void Start()
{
// ...
ConnectWebSocket();
}
void ConnectWebSocket()
{
// ...
// Добавление обработчика ответа от сервера
_ws.OnMessage += OnMessage;
// ...
}
void Update()
{
// ...
while (_actions.Count > 0)
{
if (_actions.TryDequeue(out var action))
{
// Выполнение задачи из очереди
action?.Invoke();
}
}
}
void OnMessage(object sender, MessageEventArgs e)
{
// Добавление команды в очередь
_actions.Enqueue(() => MessageHandler(sender, e));
}
void MessageHandler(object sender, MessageEventArgs e)
{
// Данный блок кода выполняется в основном (main) потоке
}