从界面为 DataGridView 从数据库重新加载数据,由于加载数据比较慢,我开启了一个线程。但是虽然开启了线程,可是主线程仍然要等待数据加载完毕才能响应,这等于辅助线程并没有起到后台的作用,界面仍然出现假死,很不爽。正确方法应该怎么处理呢。
请高手给个思路,谢谢!
- VB.NET code
DataGridView1.Columns.Clear() TempTh = New Thread(AddressOf 载入极限数据) TempTh.Start() TempTh.Join() '代码略——DataGridView1绑定数据后,处理DataGridView 列宽等属性
------解决方案--------------------
- VB.NET code
Imports System.ComponentModel
Public Class Form1
Private m_Count As Integer
Dim PrcentForm As Form2
Private Delegate Sub PrecentChangeDelegate(ByVal Precent As Integer)
Private Delegate Function RunDelegate() As Integer
Private Delegate Sub CompleteDelegate(ByVal Value As Integer)
Private Asyresult As IAsyncResult
Private List As BindingList(Of Datalist)
Private Run As RunDelegate
Private Rand As New Random
Public Sub DisPlayPrecent(ByVal Precent As Integer)
PrcentForm.PB.Value = Precent
If Precent = PrcentForm.PB.Maximum Then
PrcentForm.Close()
End If
End Sub
Private Sub OKbtn_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OKbtn.Click
m_Count = 700000
PrcentForm = Form2
PrcentForm.Show()
Run = New RunDelegate(AddressOf LoadData) '异步调用数据加载过程
Asyresult = Run.BeginInvoke(New AsyncCallback(AddressOf CallBack), Nothing)
End Sub
Private Sub CallBack() '通过回调实现绑定
Dim i As Integer = Run.EndInvoke(Asyresult)
Me.Invoke(New CompleteDelegate(AddressOf BindingData), New Object() {i})
End Sub
Private Sub BindingData(ByVal Value As Integer) '绑定到DataGridView1
DataGridView1.DataSource = List
Me.Text = Value
End Sub
Private Function LoadData() As Integer '模拟加载数据
List = New BindingList(Of Datalist)
Dim i As Integer = 1
Dim Sum As Long = 0
While i <= m_Count
Dim T As New Datalist(i)
Me.Invoke(New PrecentChangeDelegate(AddressOf DisPlayPrecent), New Object() {CInt(i / m_Count * 100)})
List.Add(T)
'Sum += i
i += 1
End While
Return i
End Function
End Class
Public Class Datalist '数据模型
Private m_Number As Integer
Public ReadOnly Property Number()
Get
Return m_Number
End Get
End Property
Public Sub New(ByVal I As Integer)
m_Number = I
End Sub
End Class