小编Vah*_*hid的帖子

EF 6中的async-await问题

我正在尝试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)

wpf entity-framework async-await entity-framework-6

3
推荐指数
1
解决办法
1624
查看次数