【问题标题】:Check is finish of async and await检查异步完成并等待
【发布时间】:2018-01-25 13:25:22
【问题描述】:

我正在尝试了解asyncawait。现在我想在我当前的项目中应用asyncawait 关键字。我的流程结构是:

//DataAccess 
Private List<Users> GetAllUsers()
{
   .... ;
   return List<Users>
}

//UI
List<Users> UserList=new List<Users>();
private async void Ok_ClickAsync(object sender, RoutedEventArgs e)
{
    //I want to select all user ant assign to UserList but currently it not use.
    UserList=await BindUser();    
}

private async Task<List<Users>> BindUser()
{
  List<Users> model=await Task.Run(()=>GetAllUsers());
  return model;
}
private void btnSave_Click(object sender, RoutedEventArgs e)
{
   //I want to use UserList here and want to validate process   
}

问题是如果我快速单击保存单击按钮,UserList 计数是 0(实际上 UserList 记录超过 100,000)。所以我想在进行验证过程之前检查 BindUser() 过程是否完成Save_Click()。请让我知道最佳解决方案并帮助我理解 asyncawait 关键字。谢谢。

【问题讨论】:

  • 在 GetAllUsers 方法中实现 await async 并从那里返回 Task>。 List model=await GetAllUsers();
  • 如果您使用 LINQ 和 EF ,它会影响您的性能,因为它们在大型数据库中非常慢。我建议你使用分页,只获取你想要的那些记录。

标签: c# wpf async-await


【解决方案1】:

这个问题不是很清楚,但如果我理解正确的话:

代替

//UI
List<Users> UserList=new List<Users>();

您可以保留对任务的引用,该任务将为您提供用户列表:

//UI
Task<List<Users>> users;

然后:

private async Task btnSave_Click(object sender, RoutedEventArgs e)
{
     if (users != null)
     {
          List<Users> userList  = await users;
          // Your validations etc.
     }
}

显然,这不处理错误情况,但允许您使用 async/await 检索用户列表。

【讨论】:

    猜你喜欢
    • 2020-10-04
    • 2019-05-31
    • 2021-12-10
    • 2019-06-16
    • 2018-03-05
    • 2020-01-02
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多