我在ViewModel中有这个方法来查询数据库中的项目:
public void GetProducts(DateTime date1, ...)
{
var list = SQLQuery.GetProducts(DateTime date1, ...);
Products = list.ToList();
}
在视图中我调用这样的方法:
await Task.Run(() => vm.GetProducts(...));
这是我发现的简单方法,以便在方法运行时使UI响应。问题是我无法再次运行该方法。
编译器说,由该方法提供的集合视图不再是线程安全的。
到目前为止,我一直在尝试使用Dispatcher来运行该方法,但是我还没有找到运行它的async并保留await运算符。
答案 0 :(得分:3)
你应该将两者分开 - 在后台线程上获取产品,然后在UI线程上更新UI:
public IEnumerable<Product> GetProducts(DateTime date1, ...)
{
return SQLQuery.GetProducts(DateTime date1, ...).ToList();
}
并致电:
var products = await Task.Run(() => vm.GetProducts(...));
vm.Products = products;
虽然我建议将此逻辑作为命令或类似命令移入视图模型。