@Sneiksus

Как подождать завершение Task?

При нажатии кнопки у меня создаётся другой поток(Таск) который создаёт окно или обрабатывает неверный ввод.Я пытался сделать ожидание в основном потоке через async/await.Но оно не работает и если я нажму кнопку 3 раза у меня создаться 3 окна, а мне нужно одно.При этом основной поток не должен блокироваться(зависать UI)

private async void button_Click(object sender, RoutedEventArgs e)
        {
            await Task.Run(() => GO());
        }

        void GO()
        {
            string email = "null", password = "null";
            Dispatcher.Invoke(() => { email = Email.Text; password = Password.Password; });

            using (EFContext _context = new EFContext())
            {
                var res = _context.User.FirstOrDefault(x => x.Email == email && x.Password == password);
                if (res != null)
                {
                    Dispatcher.Invoke(() =>
                    {
                        MainWindow w = new MainWindow(res.Id);
                        w.Show();
                        this.Close();
                    });
                }
                else
                {
                    Dispatcher.Invoke(() => IncorrectData.Visibility = Visibility.Visible);
                }
            }
        }
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
Task task = null;

private async void button_Click(object sender, RoutedEventArgs e)
{
    if(this.task != null)
    {
        return;
    }

    this.task = Task.Run(() => GO());
    await this.task;
    this.task = null;
}

void GO()
{
    string email = "null", password = "null";
    Dispatcher.Invoke(() => { email = Email.Text; password = Password.Password; });

    using (EFContext _context = new EFContext())
    {
        var res = _context.User.FirstOrDefault(x => x.Email == email && x.Password == password);
        if (res != null)
        {
            Dispatcher.Invoke(() =>
            {
                MainWindow w = new MainWindow(res.Id);
                w.Show();
                this.Close();
            });
        }
        else
        {
            Dispatcher.Invoke(() => IncorrectData.Visibility = Visibility.Visible);
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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