为啥我的调用会在网格加载时间上增加 10 秒?
Posted
技术标签:
【中文标题】为啥我的调用会在网格加载时间上增加 10 秒?【英文标题】:Why is my invoke adding 10 seconds onto grid loading time?为什么我的调用会在网格加载时间上增加 10 秒? 【发布时间】:2020-11-25 19:32:38 【问题描述】:我试图添加一个方法调用程序来阻止我的错误日志被垃圾邮件“锁定时无法更改边界”。
这解决了我的问题,但是...它使我的 RadGridView 的加载时间增加了 10 秒。
我查看了https://www.telerik.com/forums/bounds-cannot-be-changed-while-locked 来设置我的调用程序,但我看不到其他任何东西可以帮助我解决我的问题。
我在下面附上了我的代码示例,我们将不胜感激。
Private Sub bgw_initialLoad_DoWork(sender As Object, e As DoWorkEventArgs)
Try
liveDS = New DataSet
Dim dsholder As DataSet = GetDataFromSQL("LoadData")
Dim dt1 As DataTable = dsholder.Tables(0)
Dim dt_1 As DataTable = dt1.Copy()
dt_1.TableName = "Customer"
liveDS.Tables.Add(dt_1)
Dim dt2 As DataTable = dsholder.Tables(1)
Dim dt_2 As DataTable = dt2.Copy()
dt_2.TableName = "Orders"
liveDS.Tables.Add(dt_2)
Dim dt3 As DataTable = dsholder.Tables(2)
Dim dt_3 As DataTable = dt3.Copy()
dt_3.TableName = "OrderLine"
liveDS.Tables.Add(dt_3)
If RadGridView.InvokeRequired Then
RadGridView.Invoke(New MethodInvoker(AddressOf SetupDataSources))
Else
SetupDataSources()
End If
Catch ex As Exception
sendCaughtError(ex)
End Try
End Sub
Private Sub SetupDataSources()
If liveDS.Tables.Count > 1 Then
RadGridView.DataSource = liveDS.Tables("Customer")
liveOrdersTemplate.DataSource = liveDS.Tables("Orders")
liveOrdersTemplate2.DataSource = liveDS.Tables("OrderLine")
End If
End Sub
Private Sub bgw_initialLoad_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
Try
RadGridView.DataSource = liveDS.Tables("Customer")
Dim template As New GridViewTemplate()
template.DataSource = liveDS.Tables("Orders")
RadGridView.MasterTemplate.Templates.Add(template)
Dim template2 As New GridViewTemplate()
template2.DataSource = liveDS.Tables("OrderLine")
RadGridView.Templates(0).Templates.Add(template2)
Dim relation As New GridViewRelation(RadGridView.MasterTemplate)
relation.ChildTemplate = template
relation.ParentColumnNames.Add("Invoice Customer")
relation.ChildColumnNames.Add("InvoiceCode")
RadGridView.Relations.Add(relation)
Dim relation2 As New GridViewRelation(RadGridView.Templates(0))
relation2.ChildTemplate = template2
relation2.ParentColumnNames.Add("OrderNo")
relation2.ChildColumnNames.Add("OrderNo")
RadGridView.Relations.Add(relation2)
FormatGrid()
SplitContainer2.Panel1.Enabled = True
SplitContainer1.Panel2.Enabled = True
refreshMainGrid()
HideLoadingGif()
Catch ex As Exception
sendCaughtError(ex)
End Try
End Sub
【问题讨论】:
【参考方案1】:调试线程可能很困难,相信我。这不是一个“真实”的答案,而是一堆可能会有所帮助的提示 - 我希望这会发生。
调试菜单中有专门的窗口可能会有所帮助。我从this webpage 开始,当时我想知道我的应用程序发生了什么以及为什么它发生的原因并不明显。
此外,当您的并行线程正在运行时,如果您的 IDE 未设置为在每次崩溃时暂停,它可能会“静默崩溃”,在这种情况下,它不会返回值而只会保持静默。确保至少设置了这些选项:
并且不要忘记在调试时显示此窗口:(上一张图片显示的是线程和调用堆栈,虽然它们在调试时很好用,但这是我想要的并行堆栈 )
最后一件事:这么大的延迟可能与数据库有关。我不是说它是,但你应该意识到这种可能性。
现在以下内容本身并不是答案的一部分,而是更友好的建议:将您的调用逻辑放在SetupDataSources()
中,这样无论它被称为什么,您都将是线程安全的。像这样:
Private Sub SetupDataSources()
If RadGridView.InvokeRequired Then
RadGridView.Invoke(Sub() SetupDataSources())
End If
If liveDS.Tables.Count > 1 Then
RadGridView.DataSource = liveDS.Tables("Customer")
liveOrdersTemplate.DataSource = liveDS.Tables("Orders")
liveOrdersTemplate2.DataSource = liveDS.Tables("OrderLine")
End If
End Sub
祝你好运......你可能需要一些;)
【讨论】:
如果使用多个线程,“Parallel Stacks”窗口可能比“Call Stack”窗口更有用。 @Craig 事实上,我以某种方式混合了线程和并行堆栈。我正在更新这个。 @laancelot 谢谢!我已经实现了这些建议,但是当调试并行堆栈窗口中没有出现任何内容时,我已将调用移至 SetupDataSources 方法但现在它没有被调用 - 这是否意味着我不必要地将数据源分配为两倍当我单击刷新按钮时,数据仍会加载 @Oliver 就像手表一样,除非您处于断点中,否则并行堆栈将无法使用。即使没有多线程,您也应该至少有一个线程。以上是关于为啥我的调用会在网格加载时间上增加 10 秒?的主要内容,如果未能解决你的问题,请参考以下文章
为啥即使服务仍然引用它,也会在 DataContract 上调用 Dispose?