【发布时间】:2016-02-15 12:54:46
【问题描述】:
以下 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
谢谢
【问题讨论】:
-
这似乎是正确的,是否有比调用中可能导致阻塞的代码更多的代码?
-
@DoomVroom 没有其他代码可能导致阻塞,但是运行 Windows 窗体的代码在大型 Windows 应用程序内运行的插件类中执行 - 可能是客户端应用程序以某种方式阻止插件类创建新线程?我将如何检测呢?谢谢!
-
根据我的 JsonConvert 经验,它不需要很长时间。我不知道您要转换的表格有多大。我可能会模拟一个反序列化您的数据表的测试。只需对表和反序列化进行单元测试,看看需要多长时间。看看测试是否符合您的期望。我还假设您也在函数中使用 Async,因为您的代码没有说明它。
-
您正在通过调用
Wait或Result阻止外部任务。 -
@DoomVroom 谢谢-查看我的更新。为 DataGridView 设置数据源时,UI 似乎挂起。关于如何解决这个问题的任何建议?
标签: .net vb.net multithreading asynchronous json.net