我正在尝试async-await编程与实体框架6(代码优先)+ WPF,我不明白为什么在我使代码异步后UI仍然冻结.这是我从第一行开始做的事情:
首先有一个事件处理程序响应单击按钮:
private async void LoginButton_Click(object sender, RoutedEventArgs e) {
if (await this._service.Authenticate(username.Text, password.Password) != null)
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
然后我在我的服务层中有Authenticate方法:
public async Task<User> Authenticate(string username, string password) {
CurrentUser = await this._context.GetUserAsync(username.ToLower().Trim(), password.EncryptPassword());
return CurrentUser;
}
Run Code Online (Sandbox Code Playgroud)
最后是上下文中的EF代码:
public async Task<User> GetUserAsync(string username, string password) {
return await this.People.AsNoTracking().OfType<User>().FirstOrDefaultAsync(u => u.Username == username && u.Password == password);
}
Run Code Online (Sandbox Code Playgroud)
更新:在一些跟踪之后,UI冻结的原因结果是初始化过程.UI线程阻塞,直到初始化EF上下文,一旦完成,实际的查询/保存过程将异步执行.
在单击处理程序开头的Task.Yield()上调用后更新 Debug输出:
53:36:378 Calling Task.Yield
53:36:399 Called Task.Yield
53:36:400 awaiting for AuthenticateAsync
53:36:403 awaiting for GetUserAsync
'MyApp.vshost.exe' (Managed (v4.0.30319)): Loaded …Run Code Online (Sandbox Code Playgroud)