Cargue datos en modo de fondo usando trabajador de fondo en VB.NET

Estoy usando una consulta de una base de datos SQLite como AutocompleteCustomSource para un ComboBox. Además, quiero cargar datos en un hilo separado. Mi método LoadData funciona bien cuando se llama directamente, pero falla cuando se llama desde el subproceso BackgroundWorker. Cuando se llama desde el subproceso de fondo, lanza un Specified cast is not valid excepción en el csearch.AutoCompleteCustomSource.Add(hh("Taj")) línea. A continuación se muestra mi código:

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

preguntado el 03 de mayo de 12 a las 14:05

Intenta cambiarlo a hh("Taj").ToString -

¿Estás diciendo que esto no falla si llamas? LoadData directamente en lugar de a través de un trabajador de fondo? -

¡Sí exactamente! Carga datos normalmente pero congela el formulario hasta que carga todos los datos. Quiero que cargue datos y, al mismo tiempo, el usuario pueda usar la aplicación normalmente. -

Es extraño que obtenga ese error de conversión, pero el problema puede ser que esté accediendo al cuadro combinado desde el subproceso de trabajo. Se supone que nunca debe acceder a controles o formularios desde otro hilo. Debe hacer todo el trabajo de la interfaz de usuario en el subproceso de la interfaz de usuario. La forma habitual de hacerlo es utilizar el método Invocar del formulario o control. -

¡Exactamente! Tienes razón. He intentado esto y resuelto el problema. Gracias por adelantado. -

4 Respuestas

Necesitaríamos saber en qué línea falló, pero de un vistazo, intente usar ampersand en lugar de signos más para concatenar sus cadenas en VB.

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

contestado el 03 de mayo de 12 a las 15:05

Falla aquí: csearch.AutoCompleteCustomSource.Add(hh("Taj")) - user1268773

Muchas gracias por la respuesta rápida Pero he intentado esto. El error sigue siendo el mismo. - usuario1268773

¿Cuál es el valor de hh("Taj") aquí? - mayordomo shawn

Cambiar:

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

A:

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

contestado el 03 de mayo de 12 a las 15:05

Gracias por las respuestas tan rápidas chicos. Pero hice todas estas cosas pero el error sigue siendo el mismo :( - user1268773

Intenta agregar Option Strict On a la parte superior de su archivo y vea si eso le da más mensajes útiles. - steven doggart

¿Recompilaste después de agregar el Option Strict On? Debería fallar al compilar con eso activado. - steven doggart

Sí, no ocurrió nada interesante. Tengo un montón de otros errores, hermano. ¿Miraste la captura de pantalla? - usuario1268773

La captura de pantalla a la que se vinculó parece mostrar un mensaje que muestra el depurador mientras se ejecuta el proceso. No muestra errores del compilador. - steven doggart

Es extraño que obtenga ese error de conversión, pero el problema es que está accediendo a la propiedad de ComboBox desde el subproceso de trabajo. Se supone que nunca debe acceder a controles o formularios desde otro hilo. Debe hacer todo el trabajo de la interfaz de usuario en el subproceso de la interfaz de usuario. La forma habitual de hacerlo es utilizar el formulario o el control Invoke método.

contestado el 03 de mayo de 12 a las 16:05

Sí, use los signos de unión en lugar del signo más. VB.net no interpreta el + como concatenación (el signo más se usa en lenguajes basados ​​en C). Si esto no resuelve su error, use un bloque 'try catch' alrededor de su código para probar. Vea a continuación un ejemplo.

Agregue un punto de quiebre sobre la captura. Use un reloj para inspeccionar toda la información sobre el error.

contestado el 03 de mayo de 12 a las 15:05

El signo más se concatena en VB.NET y es perfectamente seguro y, en mi opinión, preferible, siempre que esté utilizando Option Strict On. El ampersand era necesario en VB6, pero en .NET es un poco complicado para la compatibilidad con la sintaxis de VB6. Elude la funcionalidad de sobrecarga de operadores estándar que proporciona .NET. - steven doggart

No tengo problemas con el signo más, pero tengo un problema con 'backgroundworker'. Mi come funciona bien cuando solo llamo al evento 'LoadData ()' OnFormLoad o onClick. Tengo que ejecutar este sub a través de 'BackgroundWorker1.RunWorkerAsync()' - user1268773

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.