Я экспериментирую с асинхронным ожиданием, и я сталкиваюсь с блокировкой пользовательского интерфейса, которое не должно происходить.WPF UI блокирует в ожидании DbContext
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
LoadButton.Click += LoadButton_OnClick;
}
private async void LoadButton_OnClick(object sender, RoutedEventArgs e)
{
LoadButton.IsEnabled = false;
// await Task.Delay(2000);
using(TestContext ctx = new TestContext())
{
IList<User> users = await ctx.Users.ToListAsync();
}
LoadButton.IsEnabled = true;
}
}
Если я комментирую бит DbContext и раскомментируйте Task.Delay, он ведет себя так, как и ожидалось - не блокирует пользовательский интерфейс.
Основываясь на моем понимании, метод ToListAsync() по-прежнему вызывается из потока пользовательского интерфейса, но не должен блокировать его. Даже если метод связан с ЦП (возможно, нет), это вызовет отставание, а не полный блок.
Мои вопросы:
Правильно ли я это понимаю?
Почему мой пользовательский интерфейс блокируется в ожидании onListAsync()?
EDIT
Я пытался делать вызов базы данных перед вызовом этого метода, чтобы прогреть все и убедиться, что он не блокирует о создании первого соединения. Также я попытался добавить пару тысяч записей в DbSet и ждать SaveChangesAsync, и то же самое происходит - пользовательский интерфейс полностью замораживается в течение нескольких секунд.
EDIT 2
Я попробовал еще один пример с тем же кодом и, кажется, работает. Разница в том, что в первом примере я использую Code First и SQL CE и в рабочем примере Database First и SQL Server.
'Task.Delay (2000)', конечно, заблокирует код в течение 2 секунд. Вы должны объяснить, почему вы хотите отложить на 2 секунды. – Hopeless
@Hopeless он тестирует, что пользовательский интерфейс не блокируется в ожидании. Моделирование задачи, связанной с процессором –
@alexw, вы имеете в виду, что он включил эту строку для проверки? – Hopeless