为啥我的调用会在网格加载时间上增加 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 秒?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不以指定的延迟进行 ajax 调用

多个存储过程调用或遍历数组?

为啥即使服务仍然引用它,也会在 DataContract 上调用 Dispose?

为啥 OpenCV Mat 会造成内存泄漏?

为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?

核心数据:为啥必须调用重新加载数据才能使我的应用程序正常工作?