Cargue datos en modo de fondo usando trabajador de fondo en VB.NET
Frecuentes
Visto 3,102 veces
0
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
4 Respuestas
0
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
0
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
0
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
-1
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 vb.net multithreading or haz tu propia pregunta.
Intenta cambiarlo a
hh("Taj").ToString
- LarsTech¿Estás diciendo que esto no falla si llamas?
LoadData
directamente en lugar de a través de un trabajador de fondo? - Steven Doggart¡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. - user1268773
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. - Steven Doggart
¡Exactamente! Tienes razón. He intentado esto y resuelto el problema. Gracias por adelantado. - user1268773