vb.net 4个线程来填充同一数据库

vb.net 4个线程来填充同一数据库,vb.net,for-loop,Vb.net,For Loop,您好,我有一个循环,持续大约2小时才能完成,它从internet获取数据并将其填充到数据库中,因此我想将其划分为4个线程,在将其放入应用程序之前,我正在尝试进行一些测试 下面是我编写的一个示例,用4个线程填充一个数据库 我得到一个错误“BindingSource不能是它自己的数据源” "////////////////////////////////////////////////////////////////////////////////////////// Private Sub Bu

您好,我有一个循环,持续大约2小时才能完成,它从internet获取数据并将其填充到数据库中,因此我想将其划分为4个线程,在将其放入应用程序之前,我正在尝试进行一些测试

下面是我编写的一个示例,用4个线程填充一个数据库 我得到一个错误“BindingSource不能是它自己的数据源”

"//////////////////////////////////////////////////////////////////////////////////////////

 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

由于DataGridView控件使用DataTable作为数据源,因此需要更新DataTable,而不是DataGridView控件


这些线似乎没有必要。只需使用一个BackgroundWorker线程就可以不冻结GUI。

因为DataGridView控件使用DataTable作为数据源,所以需要更新DataTable,而不是DataGridView控件



这些线似乎没有必要。只需使用一个BackgroundWorker线程就可以不冻结GUI。

为什么您认为使用线程会有所帮助?很可能IO是瓶颈,添加线程对此没有帮助。这可能没有帮助,但我只是想学习如何使用它们,所以我想知道为什么会生成异常。我会说错误与线程无关。您如何绑定数据?您是否将控件绑定到自身?我已经在问题中添加了代码,在google上进行了一些研究,它似乎是关于跨线程的,但我想知道如何修复它为什么您认为使用线程会有所帮助?很可能IO是瓶颈,添加线程对此没有帮助。这可能没有帮助,但我只是想学习如何使用它们,所以我想知道为什么会生成异常。我会说错误与线程无关。您如何绑定数据?您是否将控件绑定到自身?我已经在问题中添加了代码,在google上进行了一些重新搜索,它似乎是关于跨线程的,但我想知道如何修复它。第一个错误消失了,但现在我得到了“DataTable内部索引已损坏”@user1570048这是因为你的线程。您有四个线程试图同时更新单个内容。因此,为什么Oded评论说“添加线程不会有帮助”。所以没有解决方案吗?如果每个线程都有自己的线程呢connection@user1570048什么问题?线程并不能使事情变得更快。我知道这取决于io ram和互联网速度!,但是有没有办法让上面的代码正常工作,4个线程同时运行相同的databaseok第一个错误消失了,但是现在我得到了“DataTable内部索引已损坏”@user1570048这是因为你的线程。您有四个线程试图同时更新单个内容。因此,为什么Oded评论说“添加线程不会有帮助”。所以没有解决方案吗?如果每个线程都有自己的线程呢connection@user1570048什么问题?线程并不能使事情变得更快。我知道这取决于io ram和互联网速度!,但是否有一种方法可以让上述代码正常工作,即在同一数据库中同时运行4个线程
 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