防止 "没有反应"。

问题描述 投票:0回答:1

当在Form上运行代码时,有时(通常是在循环时)程序标题会显示 "Not Responding",尽管它仍然运行正常。

在我的例子中,我正在循环并填充一个数组>数组到DataTable>DataTable到DataGridView。

例子。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim ArrayNew(1000001, 2) As Object

    For i = 0 To 1000000
        For j = 0 To 1
            ArrayNew(i, j) = "TEST"
        Next j
    Next i

    Table1 = New DataTable("EXAMPLETABLE")
    Table1.Columns.Add("COLUMN1")
    Table1.Columns.Add("COLUMN2")
    Table1.Columns.Add("COLUMN3")

    Dim RowNo As Integer = 0
    Do
        Table1.Rows.Add(New String() {RowNo + 1, ArrayNew(RowNo, 0), ArrayNew(RowNo, 1)})
        RowNo = RowNo + 1
    Loop Until ArrayNew(RowNo, 1) = ""

    DataGridView1.DataSource = Table1

End Sub

我在某处读到,我应该使用线程或BackgroundWorker 但我不确定如何在这里使用这些东西,就像很多问题一样 BackgroundWorker类.

但我不懂C#。

vb.net loops datagridview backgroundworker
1个回答
1
投票

要做的第一件事就是丢掉一个 BackgroundWorker 组件到表单上。点击该组件,并为该组件设置处理程序。DoWork, RunWorkerCompletedProgressChanged 事件。然后,假设你使用了所有的默认名称,你的代码就会像这样。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    backgroundWorker1.RunWorkerAsync()
End Sub

Private Sub backgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles backgroundWorker1.DoWork
    Dim worker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
    Dim Table1 As New DataTable("EXAMPLETABLE")
    Table1.Columns.Add("COLUMN1")
    Table1.Columns.Add("COLUMN2")
    Table1.Columns.Add("COLUMN3")

    Dim Size As Integer = 1000000
    For i As Integer = 1 To Size
        Table1.Rows.Add(New String() {i.ToString(), "Test", "Test"})
        If i Mod 50 = 0 Then
            worker.ReportProgress(i * 100.0 / Size) 'Report as a percentage of the total
        End If
    Next
    e.Result = Table1
End Sub

Private Sub backgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs)
    DataGridView1.DataSource = DirectCast(e.Result, DataTable)
End Sub

Private Sub backgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles backgroundWorker1.ProgressChanged
        'Check e.ProgressPercentage here
End Sub

这是基本的例子 This is the basic example. 你也可以用它来做一些事情,比如报告进度,并确保在启动它之前它还没有忙起来。更多的信息(包括C#的例子,但很容易翻译成VB.Net)在这里。

https:/docs.microsoft.comen-usdotnetapisystem.componentmodel.backgroundworker?view=netcore-3.1。

© www.soinside.com 2019 - 2024. All rights reserved.