我不确定这个州。我需要从数据库异步获取数据。
我有课程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());
答案 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; - 您的代码行为,就像它的异步一样,但它实际上只是在后台线程上同步运行。