加载数据(异步/等待)

时间:2017-02-01 21:29:17

标签: c# async-await

我不确定这个州。我需要从数据库异步获取数据。

我有课程DB

public class Db{

public async Task<ObservableCollection<Person>> GetAllPerson()
{ 
 using (var context = new Db())
 {
    // get data and return ObservableCollection<Person>  
 }
}               

}

在ViewModel中,我调用LoadData函数。

public class VM{

    public ObservableCollection<Person> Person { get; set; }
private readonly DB sqlRepository;

public VM()
{
    sqlRepository=new DB();
    LoadData();
}
private async void LoadData()
    {
        Person= await sqlRepository.GetAllPerson();
    }

}

我收到警告:警告CS1998此异步方法缺少'await'运算符并将同步运行。

如何异步运行我的函数? 我应该用吗?

Person=await Task.Run(()=>this.sqlRepository.GetAllPerson());

1 个答案:

答案 0 :(得分:3)

  

如何异步运行我的函数?

您正在从错误的方向接近您的问题。你正试图去&#34;在&#34; - 您的ViewModel想要异步加载数据库数据。这是描述问题的好方法,但这是解决问题的错误方法。

为了更容易解决,从另一端开始。无论实际调用数据库的任何方法(例如,实体框架调用)都应该首先异步 ,然后让async从那里生长出来。最终你会得到类似的东西:

public async Task<ObservableCollection<Person>> GetAllPersonAsync()
{ 
  using (var context = new Db())
  {
    // This code wasn't shown in the question.
    // But from the compiler warning, it was probably using something like
    //   var people = People.ToList();
    //   return new ObservableCollection<Person>(people);
    // And the async version should be:
    var people = await People.ToListAsync();
    return new ObservableCollection<Person>(people);
  }
}

private async void LoadData()
{
  Person = await sqlRepository.GetAllPersonAsync();
}

但我建议通过我NotifyTask中所述的MVVM async data binding article使用它。这种方法可以让你能够对繁忙的微调器进行数据绑定等等。

  

我应该使用[Task.Run]吗?

没有。那是&#34;假的异步&#34; - 您的代码行为,就像它的异步一样,但它实际上只是在后台线程上同步运行。