vb.net线程和加载面板

vb.net线程和加载面板,vb.net,multithreading,loading,Vb.net,Multithreading,Loading,我试图使用vb.net线程来避免表单冻结,并单独加载datagridview数据 我有一个名为home的主窗体,当我单击它时,其中有一个按钮,另一个名为Formone的窗体包含图表和datagridview Dim trr As System.Threading.Thread Private Sub Formone_Load(sender As Object, e As EventArgs) Handles MyBase.Load ProgressPanel1.Show(

我试图使用vb.net线程来避免表单冻结,并单独加载datagridview数据

我有一个名为home的主窗体,当我单击它时,其中有一个按钮,另一个名为Formone的窗体包含图表和datagridview

Dim trr As System.Threading.Thread
    Private Sub Formone_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ProgressPanel1.Show() '// this is loading GIF
        trr = New Thread(AddressOf load_dgv)
        trr.Priority = ThreadPriority.AboveNormal
        trr.Start()

        stats() '/ this is chartcontrol 


    End Sub

        Private Sub load_dgv()
            'here sql server query and load it to a table
        end sub 

      Sub assignit(ByVal x As DataTable)

    If Me.InvokeRequired Then

        Me.Invoke(New Action(Of DataTable)(AddressOf assignit), x)
    Else


        GridControl1.DataSource = x

        

        ProgressPanel1.Hide()
    End If
数据通常加载到datagridview和图表,但在加载数据时表单会冻结,加载的gif不会显示,按钮也会冻结


我希望在加载数据时显示加载的gif并避免冻结。

发生这种情况的原因如下:

只能在UI线程中处理动画

我的申请有这个问题

以下是你要做的:

在UI线程中:

Splash.Show
BackgroundWorker.RunWorkerAsync 'execute the background worker
While BackGroundWorker.IsBusy = True 'wait for the background worker
Application.DoEvents()
End While
SplashScreen.Show
'哪个屏幕上有您的动画/logo/gif

当您的工作线程加载数据时,您需要在它后面放置一个等待函数

转到vb中的工具箱并选择后台工作程序。双击背景工作者对象,它将带您进入BackgrounderWOrker_DoWork()部分

这是你装东西的地方

返回您的UI线程:

Splash.Show
BackgroundWorker.RunWorkerAsync 'execute the background worker
While BackGroundWorker.IsBusy = True 'wait for the background worker
Application.DoEvents()
End While
这样,gif将在UI线程上运行时显示smoothlty,而backgrounder worker将加载您的数据。
.

这里的第二个示例:。请阅读第一个示例中的注释,这里也可以使用,只需更改返回值和控件类型。如果要加载和显示大量数据,请使用DataGridView的VirtualMode。引入
任务之前的一个选项是
BackgroundWorker
。您可以在
DoWork
事件处理程序中查询数据库,以填充
DataTable
,并将其分配给
e.Result
属性,然后从
RunWorkerCompleted
事件处理程序中的
e.Result
属性中获取它,并将其绑定到您的网格。@jmchinney您可以展示一个这样的代码示例吗?那么加载动画呢?当你搜索时,你对自己找到的示例有什么不理解的?谢谢,我已经这么做了,但问题是在我开始将数据加载到datagridview之前表单就冻结了,似乎ui元素(图表、标签等)加载得很慢