gpt4 book ai didi

.net - JsonConvert.DeserializeObject阻止UI线程

转载 作者:行者123 更新时间:2023-12-03 13:19:28 32 4
gpt4 key购买 nike

以下VB.NET代码使用Newtonsoft JSON.NET库,并在按钮单击事件处理程序中执行并阻止UI线程:

Dim table As DataTable = 
Await Task.Factory.StartNew(Function() JsonConvert.DeserializeObject(of DataTable)(result))

我尝试使用不同的语法(Task.Run等),但它仍会阻止UI线程。在这里使用正确的语法是什么?

编辑:事实证明,在为DataGridView UI组件设置DataSource时,UI实际上正在阻塞。 DataTable中只有500条记录用于填充DataGridView。为什么执行此任务时UI会阻塞,即
Dim dv As DataView = table.DefaultView
DataGridView1.DataSource = dv

谢谢

最佳答案

我会尝试从事件处理程序中删除Async关键字,并使用ContinueWith方法,看看是否有帮助。
例子:

Dim context = TaskScheduler.FromCurrentSynchronizationContext()
Dim t = Task.Factory.StartNew(Function() JsonConvert.DeserializeObject(Of DataTable)(result))

t.ContinueWith(Sub(res)
If res.Result IsNot Nothing Then
' Do something with your data table
End If
End Sub, context)

这不会阻塞您的UI线程,并且您可以在操作完成后处理数据表。但是请记住,事件处理程序将立即返回,并且 ContinueWith处理程序将在以后触发。因此,您可能必须相应地调整UI(禁用按钮等。)

编辑:
更新了代码示例以反射(reflect)DoomVroom的建议

更新:
为了响应OP的更新,我建议创建一个 View ,并首先只在其中加载几条记录。当用户滚动或翻页时,向其中添加更多记录。一次添加500条以上的记录会使UI线程不堪重负,您会遇到阻塞。

关于.net - JsonConvert.DeserializeObject阻止UI线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35409913/

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