我有一个MVVM应用程序。我有observablecollection来保存我的模型。如果OnCollectionChanged被触发我们有&;add&;事件,然后将项目插入到数据库中。
我有一个函数从文件中读取数据,创建模型并将它们添加到集合中。由于我的数据库中的关系,我必须按一定的顺序添加它们。
的例子:
- Post (Post id, Post number, Post town)
- 性别(Gender id, Gender)
- 人员(姓名、职位id、性别id)
所以我会首先制作Post模型,将它们添加到ObservableCollection,然后触发OnCollectionChanged,触发insert。然后我会添加Gender模型,然后是Person模型。首先是ObservableCollection
我想把这个导入文件移到背景中。我使用的是一个异步命令,它可以锁,设置BindingOperations。启用lecollectionsynchronization并运行Task.Run。在任务内部,我调用一个方法读取文件并在对象中返回数据,第二个void方法使用锁在ObservableCollections中插入数据。
我的问题是,线程完成后,主线程触发OnCollectionChanged事件交替:
- 一个Post模型被添加->火灾OnCollectionChanged
- 添加One Gender模型->火灾OnCollectionChanged
- 添加一个人->火灾OnCollectionChanged
- 添加One Post模型
- 添加One Gender模型
- 添加一人
- 等等…
这将导致错误,因为它试图插入尚未插入Gender模型和Post模型的Person模型。这是预期行为吗?我可以更改这些事件触发的顺序吗?
您可以将所有的添加放到一个任务中,或者让任务按顺序开始。
Task.Run(() =>
{
AddPosts();
AddGenders();
AddPersons();
}
这种方式是异步的,但顺序正确。