Make方法运行异步和线程安全

时间:2015-05-25 09:37:41

标签: c# multithreading asynchronous

我在ViewModel中有这个方法来查询数据库中的项目:

public void GetProducts(DateTime date1, ...)
{
    var list = SQLQuery.GetProducts(DateTime date1, ...);

    Products = list.ToList();
}

在视图中我调用这样的方法:

await Task.Run(() => vm.GetProducts(...));

这是我发现的简单方法,以便在方法运行时使UI响应。问题是我无法再次运行该方法。

编译器说,由该方法提供的集合视图不再是线程安全的。

到目前为止,我一直在尝试使用Dispatcher来运行该方法,但是我还没有找到运行它的async并保留await运算符。

1 个答案:

答案 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;

虽然我建议将此逻辑作为命令或类似命令移入视图模型。