在WinForm上的单独线程中运行EF6查询按钮,单击事件

本文关键字:查询 EF6 按钮 事件 单击 运行 WinForm 单独 线程 | 更新日期: 2023-09-27 18:18:51

我对实体框架和多线程都很陌生,发现在进行大型EF查询时如何不锁定我的winforms UI有点困惑。

所以,假设我想,在一个按钮点击,查询我的数据库,并返回一个大数据集,而不是锁定UI,并能够发送消息给我的用户,查询正在进行中,我不知道如何做到这一点,但我在尝试!!

我试图(显然是错误的)从这里实现Jon Skeet的建议,所以我创建了以下代码,但我得到错误,知道我做错了。我只是不明白该怎么做才对……请提供任何链接/建议/示例代码将**非常感谢!!

我的当前代码(给出错误):

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
   Dim y As New List(Of DB_Data)
    Val1 = "Val1"
    Val2 = "Val2"
    Dim qry As task = Task.Run(Function() GetDBInfo(Val1, Val2))
    y = Await qry
End Sub

我想异步运行的方法(我不知道这是否应该是Async):

Private Async Function GetDBInfo(Val1 As String, Val2 As string) As Task(Of List(Of DB_Data))
    Dim retval As List(Of DB_Data)
    Using x As New DB_Context
        retval = Await (From rw In x.DB_Data
                         Where rw.Val1 = Val1 And
                               rw.Val2 = Val2
                         Select rw).ToListAsync
    End Using
    Return retval
End Function

再次,正如我所说的,这是不工作的,可能是死亡错误-我只是不知道任何更好的如何做正确的…任何帮助将非常感激!-即使这是在VB中,我对VB/c#解决方案同样满意。

谢谢! !

在WinForm上的单独线程中运行EF6查询按钮,单击事件

您在正确的轨道上,但您不需要EF 6的Task.Run方法。EF 6自带real异步方法,如ToListAsync。这些方法使用了新的ADO。NET的异步方法在后台,它们根本不消耗或创建任何线程。Task.Run被设计为调用cpu绑定的方法。此外,它还在线程池上启动一个任务来执行计算。但是real异步方法根本不使用任何线程,这里更多。所以只要使用

var result = await (from b in db.Blogs orderby b.Name select b).ToListAsync()

足以释放GUI线程。也不要在这里使用阻塞方法和属性,如wait或result,更多信息。