aerdev
@aerdev

Как обойти ограничение Task-ов в C#?

Здравствуйте. Я пытаюсь написать игру с применением гугловского Firebase. Подскажите, пожалуйста, как мне решить такую проблему.
Есть код:
FirebaseDatabase.DefaultInstance.GetReference("Leaders").GetValueAsync().ContinueWith(task => {
if (task.IsFaulted) {
// Сюда не смотрим...
}
else if (task.IsCompleted) {
DataSnapshot snapshot = task.Result;
// Сюда смотрим и допускаем, что я вытащил какую-то СТРОКУ из snapshot...
Debug.Log(СТРОКА); // работает
Text.text = СТРОКА; // не работает
}
});
Короче говоря, эта асинхронная задача не даёт мне поменять текст в UI-элементе Текста Юнити. Причем, в консоль все пишется нормально. Обработчик исключений говорит, что изменение этого самого текста может происходить только в главном потоке. Но я не так прост. У меня есть костыли. Я присваиваю эту СТРОКУ объявленной переменной string и в главном потоке пишу метод1, который переносит её в Text.text. Только из-за асинхронности этого ContinueWith данные не успевают обновляться, и мне приходится в метод1 делать задержку потока (await Task.Delay()). Я понимаю, что это костыль на костыле, но у меня не хватает знаний, чтобы узнать как тут лучше поступить.
Есть ли способ изменить Text.text прямо из асинхронной задачи?
Или что вы можете посоветовать в этом случае? Спасибо.
  • Вопрос задан
  • 224 просмотра
Пригласить эксперта
Ответы на вопрос 1
@CHolfield
в класс формы добавляешь аксессор
private static Form1 tmpformacc = null; // вместо Form1 название класса твоей формы

при инициализации формы присваиваешь аксессору значение
public Form1()
        {
            InitializeComponent();
            Instance = this;
        }


а в коде таска делаешь так:

tmpformacc.Invoke((MethodInvoker)delegate
                {
                    tmpformacc.Text.text = СТРОКА; //здесь код, обновляющий GUI
                });
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы