Асинхронный метод блокирует пользовательский интерфейс в WPF - PullRequest
0 голосов
/ 17 января 2019

Я создаю приложение WPF, которое просто получает некоторые данные из базы данных и отображает их. Я использовал EntityFrameworkCore с разъемом Pomelo для mysql. Подключение к базе данных работает отлично, а также данные извлекаются правильно. Проблема в том, что даже если я использую асинхронный метод с await, пользовательский интерфейс блокируется каждый раз. Это код прослушивателя Click

private async void BT_Click(object sender, RoutedEventArgs e)
    {
        var userTask = api.GetMyUserAsync();
        Console.WriteLine("started task");
        var users = await userTask;
        Console.WriteLine(users.Name);
    }

А это код запроса в Api.cs:

public async Task<User> GetMyUserAsync()
    { 
        return await context.User
            .Where(u => u.Username == username && u.Password == password)
            .FirstOrDefaultAsync();
    }

Я не могу понять, почему это происходит. Также другие ответы предлагают этот код, но для меня он не работает.

Francesco

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Этого не должно быть. Метод, который объявлен асинхронным (с суффиксом Async), не должен блокироваться при использовании с await, и ваш код должен работать нормально.

Запускаете ли вы еще один запрос в фоновом режиме? Ядро EF не поддерживает одновременный запуск нескольких запросов (см. Первое предупреждение). Если да, попробуйте выполнить все ваши запросы один за другим.

0 голосов
/ 17 января 2019

Вы неправильно вызываете свой асинхронный метод из события нажатия кнопки. Должно быть так:

await Task.Run(()=> api.GetMyUserAsync());

Посмотрите на ответ здесь: Как запустить и взаимодействовать с асинхронной задачей из графического интерфейса WPF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...