当在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#。
要做的第一件事就是丢掉一个 BackgroundWorker
组件到表单上。点击该组件,并为该组件设置处理程序。DoWork
, RunWorkerCompleted
和 ProgressChanged
事件。然后,假设你使用了所有的默认名称,你的代码就会像这样。
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。