我使用Entity Framework和JetEntityFrameworkProvider连接到MS-ACCESS数据库。
我需要运行一些长时间运行的查询,所以我使用Task.Run在一个线程上运行它们。
我遇到的问题是,即使我使用单独的线程进行查询,并且它使用了自己的连接和上下文,而这些连接和上下文没有与其他任何内容共享,所有其他查询都在数据库必须等到复杂查询完成。
以下是我提出的一个可重复性最小的例子。这是视图模型的构造函数。
Public Sub New(mainViewModel As MainViewModel, mainItem As Product)
_mainViewModel = mainViewModel
Me.MainItem = mainItem
' This line actually changes the behavior of the program
' because the view data-binds to the Supplier.
' Reading it here forces EF to load it before starting
' the complex query below.
Dim n = mainItem.Supplier.Name
Task.Run(
Sub()
Dim conn = New JetConnection($"Provider=Microsoft.Jet.OleDb.4.0;Data Source=C:\Users.<DATAPATH>.mdb;")
Dim context = New MyContext(conn)
Dim query = <Some complex LINQ query>
MessageBox.Show($"Query count: {query.Count}.")
End Sub)
End Sub
所以,这个观点会很好。但是,如果我导航回产品列表页面,那么在上述查询完成之前不会显示任何产品。
如果我注释掉了供应商名称的读取,那么这个视图第一次就可以正常工作,但是在查询完成之前,视图本身都不会显示所有后续时间。
此外,ToListAsync
似乎无法运作。看起来它只是同步执行。
我的问题: