2012-08-09 71 views
1

你好我有一個循環,持續大約2小時完成,它從互聯網獲取數據並將其填充到數據庫,所以我想分成4個線程,並且我在嘗試在我將其應用到我的應用程序之前做一些測試。vb.net 4個線程來填充相同的數據庫

所以這裏是我寫的4個線程 和我收到此錯誤,以填補一個數據庫中的樣本「的BindingSource不能是自己的數據源」

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Me.DataGridView1.DataSource = Me.bindingSource1 
    GetData("select * from products") 
End Sub 

Public Sub thread1f0() 
    For i = 0 To 500 
     DataGridView1.Item("PD", i).Value = i + 67 
     DataGridView1.Item("PDP", i).Value = i + 41 
     DataGridView1.Item("TPD", i).Value = i + 654 + 6 * 13 
     DataGridView1.Item("TPDP", i).Value = i + 342 
    Next 
End Sub 

Public Sub thread1f1() 
    For i = 501 To 1000 
     DataGridView1.Item("PD", i).Value = i + 432 
     DataGridView1.Item("PDP", i).Value = i + 421 
     DataGridView1.Item("TPD", i).Value = i + 414 
     DataGridView1.Item("TPDP", i).Value = i + 42 + 4 
    Next 
End Sub 

Public Sub thread1f2() 
    For i = 1001 To 1500 
     DataGridView1.Item("PD", i).Value = i + 4452 
     DataGridView1.Item("PDP", i).Value = i + 34 
     DataGridView1.Item("TPD", i).Value = i + 123 
     DataGridView1.Item("TPDP", i).Value = i + 44 
    Next 
End Sub 

Public Sub thread1f3() 
    For i = 1501 To 2000 
     DataGridView1.Item("PD", i).Value = i + 423 
     DataGridView1.Item("PDP", i).Value = i + 423 
     DataGridView1.Item("TPD", i).Value = i + 423 
     DataGridView1.Item("TPDP", i).Value = i + 423/2 
    Next 

End Sub 

「/////// ////////////////////////////////////////////////// /////////////

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    thread0 = New System.Threading.Thread(AddressOf thread1f0) 
    thread0.Start() 

    thread1 = New System.Threading.Thread(AddressOf thread1f1) 
    thread1.Start() 

    thread2 = New System.Threading.Thread(AddressOf thread1f2) 
    thread2.Start() 

    thread3 = New System.Threading.Thread(AddressOf thread1f3) 
    thread3.Start() 
End Sub 



Public Sub GetData(ByVal selectCommand As String) 

    Try 
     Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFileName 
     Me.dataAdapter = New OleDbDataAdapter(selectCommand, connectionString) 
     Dim commandBuilder As New OleDbCommandBuilder(Me.dataAdapter) 
     Dim table As New DataTable() 
     table.Locale = System.Globalization.CultureInfo.InvariantCulture 
     Me.dataAdapter.Fill(table) 
     Me.bindingSource1.DataSource = table 
     Me.DataGridView1.AutoResizeColumns(_ 
      DataGridViewAutoSizeColumnsMode.ColumnHeader) 
    Catch ex As OleDbException 
     MessageBox.Show(ex.Message) 
    End Try 

End Sub 
+3

你爲什麼認爲使用線程有幫助? IO有可能成爲瓶頸,添加線程無助於此。 – Oded 2012-08-09 14:36:14

+0

以及它可能沒有幫助,但我只是想學習如何使用它們,所以我想知道爲什麼是異常生成 – user1570048 2012-08-09 14:39:18

+0

我會說這個錯誤與線程無關。你如何綁定你的數據?你是否將控制權限制於自身? – Oded 2012-08-09 14:41:02

回答

1

由於DataGridView控件使用DataTable作爲DataSource,你需要更新DataTable,而不是DataGridView控件。

線程似乎並不必要。只需使用一個BackgroundWorker線程即可不凍結GUI。

+0

確定第一個錯誤消失,但現在我得到「數據表內部索引已損壞」 ! – user1570048 2012-08-09 14:59:28

+0

@ user1570048這是因爲你的線程。你有四個線程試圖同時更新一個單一的東西。因此,Oded爲什麼評論說「添加線程無助於此」。 – LarsTech 2012-08-09 15:01:57

+0

所以沒有解決方案?,如果每個線程都有自己的連接 – user1570048 2012-08-09 15:04:44