使用VB.NET中的后台工作程序在后台模式下加载数据

时间:2012-05-03 13:56:48

标签: vb.net multithreading

我使用SQLite数据库中的查询作为ComboBox的AutocompleteCustomSource。另外,我想在单独的线程中加载数据。我的LoadData方法在直接调用时工作正常,但在从BackgroundWorker线程调用时失败。从后台线程调用它时,会在Specified cast is not valid行上抛出 csearch.AutoCompleteCustomSource.Add(hh("Taj")) 异常。以下是我的代码:

Sub LoadData()

        Dim connetionString As String
        Dim cnn As SQLiteConnection
        connetionString = "Data Source=" + Application.StartupPath + "\Mydatabase.db;"
        cnn = New SQLiteConnection(connetionString)
        cnn.Open()
        Dim sqlComm88 As New SQLiteCommand("SELECT Taj FROM Taj_deu ", cnn)
        Dim hh As SQLiteDataReader = sqlComm88.ExecuteReader()
        While hh.Read()
            csearch.AutoCompleteCustomSource.Add(hh("Taj"))
        End While

    End Sub



Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

        Call loaddata()

    End Sub



 Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        BackgroundWorker1.RunWorkerAsync()

    End Sub

4 个答案:

答案 0 :(得分:0)

我们需要知道它失败了哪一行,但是乍看之下,尝试使用&符号代替加号来连接VB中的字符串。

connetionString = "Data Source=" & Application.StartupPath & "\Mydatabase.db;"

答案 1 :(得分:0)

变化:

 csearch.AutoCompleteCustomSource.Add(hh("Taj"))

要:

 csearch.AutoCompleteCustomSource.Add(hh("Taj").ToString())

答案 2 :(得分:0)

奇怪的是,它会得到该转换错误,但问题是您正在从工作线程访问ComboBox的属性。您永远不应该从另一个线程访问控件或表单。您需要在UI线程上执行所有UI工作。这样做的典型方法是使用表单或控件的Invoke方法。

答案 3 :(得分:-1)

是使用&符号代替加号。 VB.net不将+解释为串联(加号用于基于C的语言)。如果这不能解决您的错误,请在代码周围使用“try catch”块进行测试。请参阅下面的示例。

在捕获点上添加一个断点。使用手表检查有关错误的所有信息。