gpt4 book ai didi

c# - 在 WinForm 按钮单击事件的单独线程中运行 EF6 查询

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:03 24 4
gpt4 key购买 nike

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

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

我试图(显然是错误的)实现 Jon Skeet 来自 here 的建议,所以我创建了以下代码,但我遇到了错误并且知道我做错了。我只是不明白如何正确地做...请提供任何链接/建议/示例代码,我们将不胜感激!

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

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# 解决方案同样感到满意。

谢谢!!

最佳答案

您走在正确的轨道上,但您不需要 EF 6 的 Task.Run 方法。EF 6 带有 真正的 异步方法,例如 ToListAsync .这些方法在后台使用新的 ADO.NET 异步方法,它们根本不使用或创建任何线程。 Task.Run 旨在调用 CPU 绑定(bind)方法,more here .它还在线程池上启动一个任务来进行计算,more here .但是真正的异步方法根本不使用任何线程,more here .所以只需使用

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

足以释放 GUI 线程。也不要在这里使用阻塞方法和属性,例如等待或结果,more info .

关于c# - 在 WinForm 按钮单击事件的单独线程中运行 EF6 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25384424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com