Quiero hacerles la consulta, cuando utilizo thread dentro de otro thread se bloquea mi ventana, no se si es bueno aplicar un hilo dentro de otro hilo, si trabajo con un hilo todo bien pero agrego otro hilo dentro de la misma es ahi donde se bloque mi ventana.
Tal ves no tenga sentido pero lo que quiero hacer es cargar de un datatable a listview pero con el primer hilo tarda en cargar datos en el listview y por cada fila al agregar un item en listview se tarda pero la idea es acelerar la carga y la idea que tuve es por cada fila en datatable disparar otro hilo y es ahí donde empieza a bloquear mi ventana, pero la carga de datos a listview es rápido.
la pregunta es si es conveniente utilizar un hilo dentro de otro o hay otra forma de hacer hilos anidados si que me bloquee mi ventana.
El código es lo siguiente para que se me entienda bien...
Gracias de antemano por sus respuestas
Código
Imports System.Data.SqlClient Imports System.Threading Imports System.ComponentModel <Microsoft.VisualBasic.ComClass()> <ToolboxBitmap(GetType(System.Windows.Forms.ListView))> <System.Serializable()> Public Class ListView Inherits Windows.Forms.ListView Dim thSQL As Thread Dim _sq As String, _decimales As Integer, _EllipseIcon As Boolean, _bordColor As Pen Public Sub SQLConsulta(ByVal sq As String, Optional ByVal EllipseIcon As Boolean = False, Optional ByVal borderColor As Pen = Nothing, Optional ByVal decimales As Integer = 0) _sq = sq : _decimales = decimales : _EllipseIcon = EllipseIcon : _bordColor = borderColor thSQL = New Thread(AddressOf SQLConsultaInterno) thSQL.Start() End Sub Private Sub SQLConsultaInterno() Try Dim h As Thread Dim conexion As SqlConnection = New SqlConnection() conexion.ConnectionString = "Data Source=ip_server,1433;Failover Partner=ip_server2,1433;Network Library=DBMSSOCN;MultipleActiveResultSets=true;Initial Catalog=DB;User ID=sa;Password=contraseña;" : conexion.Open() Dim ds As New DataSet(), da As New SqlDataAdapter(_sq, conexion) : da.Fill(ds, "tabla") If ds.Tables("tabla").Columns.Count = 1 Then For c As Integer = 0 To ds.Tables("tabla").Columns.Count - 1 AddColumn(ds.Tables("tabla").Columns(c).Caption) Next Else For c As Integer = 1 To ds.Tables("tabla").Columns.Count - 1 AddColumn(ds.Tables("tabla").Columns(c).Caption) Next End If With ds.Tables("tabla") For filas As Integer = 0 To .Rows.Count - 1 Dim ob As New ROW ob.fila = .Rows(filas) ob.columnas = .Columns.Count ob.index = filas h = New Thread(AddressOf agregar) h.Start(ob) Next End With conexion.Close() Catch ex As Exception End Try End Sub Private Sub agregar(obj As Object) Dim rw As ROW = DirectCast(obj, ROW) If rw.columnas = 1 Then Dim Registro As New ListViewItem(rw.fila.Item(0).ToString.Trim, rw.index) AddItem(Registro) Else Dim Registro As New ListViewItem(rw.fila.Item(1).ToString.Trim, rw.index) Registro.Tag = rw.fila.Item(0).ToString.Trim For c As Integer = 2 To rw.columnas - 1 Registro.SubItems.Add(rw.fila.Item(c).ToString().Trim) Next AddItem(Registro) End If End Sub Delegate Sub AddColumns(ByVal texto As String) Private Sub AddColumn(ByVal texto As String) If Me.InvokeRequired Then Dim d As New AddColumns(AddressOf AddColumn) Invoke(d, New Object() {texto}) Else Me.Columns.Add(texto) End If End Sub Delegate Sub AddItems(ByVal item As ListViewItem) Private Sub AddItem(ByVal item As ListViewItem) If Me.InvokeRequired Then Dim d As New AddItems(AddressOf AddItem) Invoke(d, New Object() {item}) Else Me.Items.Add(item) End If End Sub Private Class ROW Property fila As DataRow Property columnas As Integer Property index As Integer End Class End Class