0

我有win form加载一些数据并填充gridview使用线程的应用程序。在这里填充网格的任务需要一点时间,因此,目前它正在使用单独的线程来完成数据填充任务。因此,目前发生的情况是 Windows 表单最初使用网格加载了一些信息,然后它将数据填充到网格中,同时用户可以使用响应式 UI。

在表单加载中

DataBind();
var newThread = new Thread(new ThreadStart(FillGrid));
newThread.Start();

FillGrid()方法将对每一行和所有列进行处理,并根据值更改单元格颜色并添加一些数据。我想要实现的不是用空数据加载表单,我想填充一半的网格并在加载表单后继续填充网格的其余部分。Thread.Sleep()我在调用后尝试使用,newThread.Start()但没有达到我的预期。

任何帮助实现这一目标!!!

为了安全地访问,gridview我参考了这篇关于从另一个线程更新表单而不为每种更新类型创建委托的文章

谢谢

4

5 回答 5

1

如前所述,使用 BackgroundWorker.ReportProgress。但是您不需要继续更新中途发回的对象(请参阅第二个链接)。

话虽如此,看看是什么导致网格缓慢填充。发回 1/2 的数据只会有一点帮助。仅加载 1/2 的数据,您真正要节省多少时间?现在您有两次 UI 刷新,因此总时间更长。

在此处输入链接描述

在此处输入链接描述

于 2012-07-17T12:59:46.010 回答
0

在后台线程中,不要触摸网格。相反,仅在某个地方使用它来填充您的数据,某些集合不绑定到网格。

创建 Timer 并在它的事件中将后台线程中填充的集合中的数据拉到 GUI 中。

这样,您就不必担心 Invoke 以及从非 gui 线程与 GUI 对话时遇到的各种问题。

于 2012-07-17T13:05:02.810 回答
0

这是一个使用后台工作者的非常简单的示例。我希望它为您指明正确的方向。

请注意我如何使用Me.Invoke()方法来更新 UI。这是必需的,因为所有 UI 元素都必须从创建它们的线程更新。

Public Class Form1
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim r As New Random()
        For index As Integer = 0 To 100
            Me.Invoke(Sub()
                          ListBox1.Items.Add(Guid.NewGuid().ToString())
                      End Sub)
            Threading.Thread.Sleep(r.Next(50, 300))
        Next
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        Me.Invoke(Sub()
                      MsgBox("Task Complete", MsgBoxStyle.OkOnly, "Task Complete")
                  End Sub)
    End Sub
End Class
于 2012-07-17T14:06:44.467 回答
0

使用 AutoResetEvent - 让主线程等待,当你有一半填满网格时;向主线程发出信号以继续..

http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

于 2012-07-17T09:09:57.340 回答
0

您应该在读取数据时填充网格。读取辅助线程中的数据,然后在网格中准备好填充数据块时通知 UI 线程。您需要做一些线程杂耍,因为 UI 需要从主线程更新,但这不应该太难。

您也可以尝试使用BackgroundWorker, 并在其ProgressChanged事件中更新网格。

于 2012-07-17T09:10:02.977 回答