none
DatagridView, BackgroundWorker, Hilos y Delegados. RRS feed

  • Pregunta

  • Bueno, habiendo recorrido foros y muchas explicaciones, no termino de interpretar

    bien el funcionamiento de BackgroundWorker, hilos, y delegados.

    Pero el problema principal que se me presenta, es que al finalizar los procesos involucrados

    en el hilo y cargar los datos al Datagrid, se me rompen los ScrollBars, tanto el vertical, como

    el horizontal. No responden a la interacción del mouse, y por ahí se hacen transparentes, etc.

    No estoy delegando, porque no lo entiendo, quizás eso tenga que ver. 

    En mi formulario tengo un botón que inicia el trabajo del bw y ahí empieza el trabajo.

    Private Sub cmdProcesar_Click(sender As Object, e As EventArgs) Handles  cmdProcesar.Click

            If Not bw.IsBusy = True Then

                bw.RunWorkerAsync()

            End If

    End Sub

       

    Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)

            Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)

            ProcesarConsulta()

    End Sub

       

    Private Sub ProcesarConsulta()

            If Not CargarDataTable() Then Exit Sub

            CrearColumnasDtlPreciosWork()

           

            For I As Integer = 0 To dtlPrecios.Rows.Count - 1

                Bucle que copia datos de un DataTable a Otro

            Next

           

            dgrPrecios.DataSource = dtlPreciosWork

     ConfigurarColumnasDataGrid()

    End Sub


    Private Function CargarDataTable() As Boolean

    Acá Marcha una serie de instrucciones que procesa una consultaSQL y carga un primer DataTable.

    End Function       


    Private Sub CrearColumnasDtlPreciosWork()

            Crea la estructura de un Segundo DataTable

    End Sub

     

    Private Sub ConfigurarColumnasDataGrid()

            Formatea las columnas del DataGridView luego de asignar el DataSource

    End Sub

    Quizás tenga que usar delegados para las funciones o procedimientos, pero no me doy cuenta cómo hacerlo, todos los ejemplos de hilos y delegados usan parametros y yo no los tengo acá, eso me confunde.

    Además otra cosa, si toco el formulario cuando está realizando el trabajo, se pone blanco, como "No responde". Vuelve cuando termina, pero eso claramente confunde al usuario.

    Quizás necesite descansar. :)

    Muchas Gracias por la sugerencia que puedan llegar a tener.



    Renzo Pique




    martes, 3 de octubre de 2017 16:50

Respuestas

  • Buenas Renzo,

    Efectivamente, accedes desde hilos que no son los que han creado el control, te voy a poner el cambio de un metodo, para que veas como deberias hacerlo

    Private Sub ConfigurarColumnasDataGrid()
            //Inicio el delegado
    	dgrPrecios.Invoke(New MethodInvoker(Sub() 
    	dgrPrecios.Columns("CODIGO").HeaderText = "Código"
    	dgrPrecios.Columns("DESCRIPCION").HeaderText = "Descripción"
    	dgrPrecios.Columns("CODIGOFABRICA").HeaderText = "Cod. Fábrica"
    	dgrPrecios.Columns("MONEDA").HeaderText = "Mon."
    	dgrPrecios.Columns("MONEDA").DefaultCellStyle.BackColor = Color.Purple
    	dgrPrecios.Columns("MONEDA").DefaultCellStyle.ForeColor = Color.White
    	dgrPrecios.Columns("MONEDA").DefaultCellStyle.SelectionBackColor = Color.Navy
    	dgrPrecios.Columns("MONEDA").DefaultCellStyle.SelectionForeColor = Color.White
    	dgrPrecios.Columns("PRECIOLISTA").HeaderText = "P. Lista"
    	dgrPrecios.Columns("PRECIOLISTA").DefaultCellStyle.BackColor = Color.LightCyan
    	dgrPrecios.Columns("CODIGODESCUENTO").HeaderText = "C. Dto."
    	dgrPrecios.Columns("DESCUENTO").HeaderText = "Descuento"
    	dgrPrecios.Columns("PLCD").Visible = False
    	dgrPrecios.Columns("FLETE").HeaderText = "% FL"
    	dgrPrecios.Columns("LISTA0").HeaderText = "P. Costo"
    	dgrPrecios.Columns("LISTA0").DefaultCellStyle.BackColor = Color.LightCyan
    	dgrPrecios.Columns("PH").HeaderText = "A"
    	dgrPrecios.Columns("PH").DefaultCellStyle.SelectionBackColor = Color.Navy
    	dgrPrecios.Columns("PH").DefaultCellStyle.SelectionForeColor = Color.Aqua
    	dgrPrecios.Columns("PH").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
    	dgrPrecios.Columns("LISTA1").HeaderText = "PL 1"
    	dgrPrecios.Columns("PORLISTA1").HeaderText = "%L 1"
    	dgrPrecios.Columns("LISTA1REL").Visible = False
    	dgrPrecios.Columns("LISTA2").HeaderText = "PL 2"
    	dgrPrecios.Columns("PORLISTA2").HeaderText = "%L 2"
    	dgrPrecios.Columns("LISTA2REL").Visible = False
    	dgrPrecios.Columns("LISTA3").HeaderText = "PL 3"
    	dgrPrecios.Columns("PORLISTA3").HeaderText = "%L 3"
    	dgrPrecios.Columns("LISTA3REL").Visible = False
    	dgrPrecios.Columns("LISTA4").HeaderText = "PL 4"
    	dgrPrecios.Columns("PORLISTA4").HeaderText = "%L 4"
    	dgrPrecios.Columns("LISTA4REL").Visible = False
    	dgrPrecios.Columns("LISTA5").HeaderText = "PL 5"
    	dgrPrecios.Columns("PORLISTA5").HeaderText = "%L 5"
    	dgrPrecios.Columns("LISTA5REL").Visible = False
    	dgrPrecios.Columns("LISTA6").HeaderText = "PL 6"
    	dgrPrecios.Columns("PORLISTA6").HeaderText = "%L 6"
    	dgrPrecios.Columns("LISTA6REL").Visible = False
    	dgrPrecios.Columns("LISTA7").HeaderText = "PL 7"
    	dgrPrecios.Columns("PORLISTA7").HeaderText = "%L 7"
    	dgrPrecios.Columns("LISTA7REL").Visible = False
    	dgrPrecios.Columns("LISTA8").HeaderText = "PL 8"
    	dgrPrecios.Columns("PORLISTA8").HeaderText = "%L 8"
    	dgrPrecios.Columns("LISTA8REL").Visible = False
    	dgrPrecios.Columns("LISTA9").HeaderText = "PL 9"
    	dgrPrecios.Columns("PORLISTA9").HeaderText = "%L 9"
    	dgrPrecios.Columns("LISTA9REL").Visible = False
    	dgrPrecios.Columns("LISTA10").HeaderText = "PL 10"
    	dgrPrecios.Columns("PORLISTA10").HeaderText = "%L 10"
    	dgrPrecios.Columns("LISTA10REL").Visible = False
    	dgrPrecios.Columns("IMPINT").HeaderText = "Imp Int"
    	dgrPrecios.Columns("ESOFERTA").HeaderText = "Oferta"
    	dgrPrecios.Columns("LISTAOFERTA").HeaderText = "L Ofer"
    	dgrPrecios.Columns("IDPROVEEDOR").Visible = False
    	dgrPrecios.Columns("PROVEEDOR").Visible = False
    
    End Sub)) //Termino el delegado
    End Sub

    Parece igual, pero si te fijas, no es el thread el que lo jecuta, sino que invoka un delegado para que sea el thread del interfaz el que lo cambie, esto es thread-safe.

    Ya se que es un trabajo cambiarlo todo en tu proyecto, pero esta es la manera correcta de acceder a controles desde otros hilos, y la manera de asegurarte de no recibir comportamientos inesperados.

    Si tienes dudas sobre como cambiar tu codigo, comentanos y te ayudamos

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    miércoles, 4 de octubre de 2017 8:09

Todas las respuestas

  • Buenas, 

    La verdad es que nos has omitido la parte más importante del código,  que es en la que interactuas con los controles, el BackGroundWorker si no recuerdo mal,  no hace interacciones thread-safe con los controles,  esto es,  no accede a ellos de manera segura, por eso hay que usar invocaciones mediante delegados,  sino,  el formulario y sus controles se pueden volver bastante "locos". 

    Pon por favor todo el código en el que interactua tu BackGroundWorker con los controles,  que me imagino que mínimo es un datagridview. 

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    martes, 3 de octubre de 2017 18:24
  • ' PROCESA LOS FILTROS Y LLENA LA GRILLA CON LOS RESULTADOS DE LA CONSULTA
        Private Sub cmdProcesar_Click(sender As Object, e As EventArgs) Handles cmdProcesar.Click
            If Not bw.IsBusy = True Then
                bw.RunWorkerAsync()
            End If
        End Sub

        Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
            Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
            ProcesarConsulta()
        End Sub

        Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
            lblCreandoGrilla.Visible = False
            Me.Refresh()
        End Sub

        Private Sub ProcesarConsulta()

            grbFiltros.Visible = False
            Me.Refresh()

            If Not CargarDataTable() Then Exit Sub

            CrearColumnasDtlPreciosWork()

            lblCantidadRegistros.Text = "/   " & (dtlPrecios.Rows.Count).ToString
            Me.Refresh()

            For I As Integer = 0 To dtlPrecios.Rows.Count - 1

                lblCuentaRegistros.Text = (I + 1).ToString
                lblCuentaRegistros.Refresh()

                Try
                    With dtlPreciosWork
                        .Rows.Add()
                        .Rows(I)("CODIGO") = dtlPrecios.Rows(I)("IDARTICULO")
                        .Rows(I)("DESCRIPCION") = dtlPrecios.Rows(I)("ART_DESCRIPCION").ToString
                        .Rows(I)("CODIGOFABRICA") = dtlPrecios.Rows(I)("ART_CODIGOFABRICA").ToString
                        .Rows(I)("MONEDA") = Trim(dtlPrecios.Rows(I)("ART_MONEDA").ToString)
                        .Rows(I)("PRECIOLISTA") = dtlPrecios.Rows(I)("ART_PRECIOLISTA")
                        .Rows(I)("CODIGODESCUENTO") = dtlPrecios.Rows(I)("ART_IDDESCUENTO")
                        .Rows(I)("DESCUENTO") = ArmaDescripcionDescuento(dtlPrecios.Rows(I)("ART_IDDESCUENTO"))
                        .Rows(I)("FLETE") = dtlPrecios.Rows(I)("ART_PORCFLETE")
                        .Rows(I)("LISTA0") = dtlPrecios.Rows(I)("ART_LISTA0")
                        .Rows(I)("PH") = ""
                        .Rows(I)("LISTA1") = dtlPrecios.Rows(I)("ART_LISTA1")
                        .Rows(I)("PORLISTA1") = dtlPrecios.Rows(I)("ART_PORCE1")
                        .Rows(I)("LISTA1REL") = dtlPrecios.Rows(I)("ART_SLREL1")
                        .Rows(I)("LISTA2") = dtlPrecios.Rows(I)("ART_LISTA2")
                        .Rows(I)("PORLISTA2") = dtlPrecios.Rows(I)("ART_PORCE2")
                        .Rows(I)("LISTA2REL") = dtlPrecios.Rows(I)("ART_SLREL2")
                        .Rows(I)("LISTA3") = dtlPrecios.Rows(I)("ART_LISTA3")
                        .Rows(I)("PORLISTA3") = dtlPrecios.Rows(I)("ART_PORCE3")
                        .Rows(I)("LISTA3REL") = dtlPrecios.Rows(I)("ART_SLREL3")
                        .Rows(I)("LISTA4") = dtlPrecios.Rows(I)("ART_LISTA4")
                        .Rows(I)("PORLISTA4") = dtlPrecios.Rows(I)("ART_PORCE4")
                        .Rows(I)("LISTA4REL") = dtlPrecios.Rows(I)("ART_SLREL4")
                        .Rows(I)("LISTA5") = dtlPrecios.Rows(I)("ART_LISTA5")
                        .Rows(I)("PORLISTA5") = dtlPrecios.Rows(I)("ART_PORCE5")
                        .Rows(I)("LISTA5REL") = dtlPrecios.Rows(I)("ART_SLREL5")
                        .Rows(I)("LISTA6") = dtlPrecios.Rows(I)("ART_LISTA6")
                        .Rows(I)("PORLISTA6") = dtlPrecios.Rows(I)("ART_PORCE6")
                        .Rows(I)("LISTA6REL") = dtlPrecios.Rows(I)("ART_SLREL6")
                        .Rows(I)("LISTA7") = dtlPrecios.Rows(I)("ART_LISTA7")
                        .Rows(I)("PORLISTA7") = dtlPrecios.Rows(I)("ART_PORCE7")
                        .Rows(I)("LISTA7REL") = dtlPrecios.Rows(I)("ART_SLREL7")
                        .Rows(I)("LISTA8") = dtlPrecios.Rows(I)("ART_LISTA8")
                        .Rows(I)("PORLISTA8") = dtlPrecios.Rows(I)("ART_PORCE8")
                        .Rows(I)("LISTA8REL") = dtlPrecios.Rows(I)("ART_SLREL8")
                        .Rows(I)("LISTA9") = dtlPrecios.Rows(I)("ART_LISTA9")
                        .Rows(I)("PORLISTA9") = dtlPrecios.Rows(I)("ART_PORCE9")
                        .Rows(I)("LISTA9REL") = dtlPrecios.Rows(I)("ART_SLREL9")
                        .Rows(I)("LISTA10") = dtlPrecios.Rows(I)("ART_LISTA10")
                        .Rows(I)("PORLISTA10") = dtlPrecios.Rows(I)("ART_PORCE10")
                        .Rows(I)("LISTA10REL") = dtlPrecios.Rows(I)("ART_SLREL10")
                        .Rows(I)("IMPINT") = dtlPrecios.Rows(I)("ART_IMPINT")
                        .Rows(I)("ESOFERTA") = dtlPrecios.Rows(I)("ART_ESOFERTA")
                        .Rows(I)("LISTAOFERTA") = dtlPrecios.Rows(I)("ART_LISTAOFERTA")
                        .Rows(I)("IDPROVEEDOR") = dtlPrecios.Rows(I)("ART_IDPROVEEDOR")
                        .Rows(I)("PROVEEDOR") = dtlPrecios.Rows(I)("ART_PROVEEDOR")
                    End With
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try
            Next

            lblCreandoGrilla.Visible = True
            Me.Refresh()

            dgrPrecios.DataSource = dtlPreciosWork
            ConfigurarColumnasDataGrid()
            grbFiltros.Enabled = False
            dgrPrecios.ScrollBars = ScrollBars.Both
            dgrPrecios.Refresh()

        End Sub

        ' PROCESAR CONSULTA EN DATATABLE ORIGINAL
        Private Function CargarDataTable() As Boolean

            CargarDataTable = False

            Dim CmndPrecios As New SqlCommand("SP_Articulos_FiltraPreciosPorConsulta", CnPrecios)
            CmndPrecios.CommandType = CommandType.StoredProcedure
            Dim adtPrecios As New SqlDataAdapter(CmndPrecios)

            Try

                Dim FMODARTDESDE, FMODARTHASTA, FMODPREDESDE, FMODPREHASTA As Integer
                Dim FAMILIA, GRUPO, MARCA, TIPODEARTICULO As Integer
                Dim PCDESDE, PCHASTA As Decimal
                Dim PROVEEDOR As String = ""

                If txtFechaModArtDesde.Text = "" Then FMODARTDESDE = 0 Else FMODARTDESDE = DateToInt(Trim(txtFechaModArtDesde.Text))
                If txtFechaModArtHasta.Text = "" Then FMODARTHASTA = 2994626 Else FMODARTHASTA = DateToInt(Trim(txtFechaModArtHasta.Text))
                If txtFechaModPreDesde.Text = "" Then FMODPREDESDE = 0 Else FMODPREDESDE = DateToInt(Trim(txtFechaModPreDesde.Text))
                If txtFechaModPreHasta.Text = "" Then FMODPREHASTA = 2994626 Else FMODPREHASTA = DateToInt(Trim(txtFechaModPreHasta.Text))
                If CDbl(txtCostoDesde.Text) = 0.0 Then PCDESDE = 0.0 Else PCDESDE = CDbl(txtCostoDesde.Text)
                If CDbl(txtCostoHasta.Text) = 0.0 Then PCHASTA = 999999999.99 Else PCHASTA = CDbl(txtCostoHasta.Text)

                If FMODARTDESDE > FMODARTHASTA Then MsgBox("La Fecha de Modificación de Artículo Desde no puede ser mayor que Hasta", vbInformation, "Procesar Consulta") : Exit Function
                If FMODPREDESDE > FMODPREHASTA Then MsgBox("La Fecha de Modificación de Precio Desde no puede ser mayor que Hasta", vbInformation, "Procesar Consulta") : Exit Function

                PROVEEDOR = txtIDProveedor.Text
                FAMILIA = Val(txtIDFamilia.Text)
                GRUPO = Val(txtIDGrupo.Text)
                MARCA = Val(txtIDMarca.Text)
                TIPODEARTICULO = Val(txtIDTipoArt.Text)

                With CmndPrecios.Parameters
                    .AddWithValue("@PROVEEDOR", PROVEEDOR)
                    .AddWithValue("@FAMILIA", FAMILIA)
                    .AddWithValue("@GRUPO", GRUPO)
                    .AddWithValue("@MARCA", MARCA)
                    .AddWithValue("@TIPODEARTICULO", TIPODEARTICULO)
                    .AddWithValue("@FMODARTDESDE", FMODARTDESDE)
                    .AddWithValue("@FMODARTHASTA", FMODARTHASTA)
                    .AddWithValue("@FMODPREDESDE", FMODPREDESDE)
                    .AddWithValue("@FMODPREHASTA", FMODPREHASTA)
                    .AddWithValue("@PCDESDE", CDbl(PCDESDE))
                    .AddWithValue("@PCHASTA", CDbl(PCHASTA))
                End With

                Try
                    dtlPrecios.Rows.Clear()
                    adtPrecios.Fill(dtlPrecios)
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try

                ' SI NO HAY RESULTADOS EN LA CONSULTA, SALE DEL PROCEDIMIENTO
                If dtlPrecios.Rows.Count <= 0 Then
                    Me.Cursor = Cursors.Default
                    Me.Refresh()
                    MsgBox("No existen resultados de acuerdo al criterio filtrado", vbInformation, "Procesar Consulta")
                    Exit Function
                End If

                CargarDataTable = True

            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                CmndPrecios.Dispose()
                adtPrecios.Dispose()
            End Try

        End Function

        ' CREA LAS COLUMNAS DEL DATATABLE QUE IRA COMO DATASOURCE
        Private Sub CrearColumnasDtlPreciosWork()
            dtlPreciosWork.Columns.Add("CODIGO")
            dtlPreciosWork.Columns.Add("DESCRIPCION")
            dtlPreciosWork.Columns.Add("CODIGOFABRICA")
            dtlPreciosWork.Columns.Add("MONEDA")
            dtlPreciosWork.Columns.Add("PRECIOLISTA")
            dtlPreciosWork.Columns.Add("CODIGODESCUENTO")
            dtlPreciosWork.Columns.Add("DESCUENTO")
            dtlPreciosWork.Columns.Add("PLCD")
            dtlPreciosWork.Columns.Add("FLETE")
            dtlPreciosWork.Columns.Add("LISTA0")
            dtlPreciosWork.Columns.Add("PH")
            dtlPreciosWork.Columns.Add("LISTA1")
            dtlPreciosWork.Columns.Add("PORLISTA1")
            dtlPreciosWork.Columns.Add("LISTA1REL")
            dtlPreciosWork.Columns.Add("LISTA2")
            dtlPreciosWork.Columns.Add("PORLISTA2")
            dtlPreciosWork.Columns.Add("LISTA2REL")
            dtlPreciosWork.Columns.Add("LISTA3")
            dtlPreciosWork.Columns.Add("PORLISTA3")
            dtlPreciosWork.Columns.Add("LISTA3REL")
            dtlPreciosWork.Columns.Add("LISTA4")
            dtlPreciosWork.Columns.Add("PORLISTA4")
            dtlPreciosWork.Columns.Add("LISTA4REL")
            dtlPreciosWork.Columns.Add("LISTA5")
            dtlPreciosWork.Columns.Add("PORLISTA5")
            dtlPreciosWork.Columns.Add("LISTA5REL")
            dtlPreciosWork.Columns.Add("LISTA6")
            dtlPreciosWork.Columns.Add("PORLISTA6")
            dtlPreciosWork.Columns.Add("LISTA6REL")
            dtlPreciosWork.Columns.Add("LISTA7")
            dtlPreciosWork.Columns.Add("PORLISTA7")
            dtlPreciosWork.Columns.Add("LISTA7REL")
            dtlPreciosWork.Columns.Add("LISTA8")
            dtlPreciosWork.Columns.Add("PORLISTA8")
            dtlPreciosWork.Columns.Add("LISTA8REL")
            dtlPreciosWork.Columns.Add("LISTA9")
            dtlPreciosWork.Columns.Add("PORLISTA9")
            dtlPreciosWork.Columns.Add("LISTA9REL")
            dtlPreciosWork.Columns.Add("LISTA10")
            dtlPreciosWork.Columns.Add("PORLISTA10")
            dtlPreciosWork.Columns.Add("LISTA10REL")
            dtlPreciosWork.Columns.Add("IMPINT")
            dtlPreciosWork.Columns.Add("ESOFERTA")
            dtlPreciosWork.Columns.Add("LISTAOFERTA")
            dtlPreciosWork.Columns.Add("IDPROVEEDOR")
            dtlPreciosWork.Columns.Add("PROVEEDOR")
        End Sub

        ' CONFIGURA LAS COLUMNAS DEL DATAGRID UNA VEZ ESTABLECIDO EL DATASOURCE
        Private Sub ConfigurarColumnasDataGrid()
            dgrPrecios.Columns("CODIGO").HeaderText = "Código"
            dgrPrecios.Columns("DESCRIPCION").HeaderText = "Descripción"
            dgrPrecios.Columns("CODIGOFABRICA").HeaderText = "Cod. Fábrica"
            dgrPrecios.Columns("MONEDA").HeaderText = "Mon."
            dgrPrecios.Columns("MONEDA").DefaultCellStyle.BackColor = Color.Purple
            dgrPrecios.Columns("MONEDA").DefaultCellStyle.ForeColor = Color.White
            dgrPrecios.Columns("MONEDA").DefaultCellStyle.SelectionBackColor = Color.Navy
            dgrPrecios.Columns("MONEDA").DefaultCellStyle.SelectionForeColor = Color.White
            dgrPrecios.Columns("PRECIOLISTA").HeaderText = "P. Lista"
            dgrPrecios.Columns("PRECIOLISTA").DefaultCellStyle.BackColor = Color.LightCyan
            dgrPrecios.Columns("CODIGODESCUENTO").HeaderText = "C. Dto."
            dgrPrecios.Columns("DESCUENTO").HeaderText = "Descuento"
            dgrPrecios.Columns("PLCD").Visible = False
            dgrPrecios.Columns("FLETE").HeaderText = "% FL"
            dgrPrecios.Columns("LISTA0").HeaderText = "P. Costo"
            dgrPrecios.Columns("LISTA0").DefaultCellStyle.BackColor = Color.LightCyan
            dgrPrecios.Columns("PH").HeaderText = "A"
            dgrPrecios.Columns("PH").DefaultCellStyle.SelectionBackColor = Color.Navy
            dgrPrecios.Columns("PH").DefaultCellStyle.SelectionForeColor = Color.Aqua
            dgrPrecios.Columns("PH").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
            dgrPrecios.Columns("LISTA1").HeaderText = "PL 1"
            dgrPrecios.Columns("PORLISTA1").HeaderText = "%L 1"
            dgrPrecios.Columns("LISTA1REL").Visible = False
            dgrPrecios.Columns("LISTA2").HeaderText = "PL 2"
            dgrPrecios.Columns("PORLISTA2").HeaderText = "%L 2"
            dgrPrecios.Columns("LISTA2REL").Visible = False
            dgrPrecios.Columns("LISTA3").HeaderText = "PL 3"
            dgrPrecios.Columns("PORLISTA3").HeaderText = "%L 3"
            dgrPrecios.Columns("LISTA3REL").Visible = False
            dgrPrecios.Columns("LISTA4").HeaderText = "PL 4"
            dgrPrecios.Columns("PORLISTA4").HeaderText = "%L 4"
            dgrPrecios.Columns("LISTA4REL").Visible = False
            dgrPrecios.Columns("LISTA5").HeaderText = "PL 5"
            dgrPrecios.Columns("PORLISTA5").HeaderText = "%L 5"
            dgrPrecios.Columns("LISTA5REL").Visible = False
            dgrPrecios.Columns("LISTA6").HeaderText = "PL 6"
            dgrPrecios.Columns("PORLISTA6").HeaderText = "%L 6"
            dgrPrecios.Columns("LISTA6REL").Visible = False
            dgrPrecios.Columns("LISTA7").HeaderText = "PL 7"
            dgrPrecios.Columns("PORLISTA7").HeaderText = "%L 7"
            dgrPrecios.Columns("LISTA7REL").Visible = False
            dgrPrecios.Columns("LISTA8").HeaderText = "PL 8"
            dgrPrecios.Columns("PORLISTA8").HeaderText = "%L 8"
            dgrPrecios.Columns("LISTA8REL").Visible = False
            dgrPrecios.Columns("LISTA9").HeaderText = "PL 9"
            dgrPrecios.Columns("PORLISTA9").HeaderText = "%L 9"
            dgrPrecios.Columns("LISTA9REL").Visible = False
            dgrPrecios.Columns("LISTA10").HeaderText = "PL 10"
            dgrPrecios.Columns("PORLISTA10").HeaderText = "%L 10"
            dgrPrecios.Columns("LISTA10REL").Visible = False
            dgrPrecios.Columns("IMPINT").HeaderText = "Imp Int"
            dgrPrecios.Columns("ESOFERTA").HeaderText = "Oferta"
            dgrPrecios.Columns("LISTAOFERTA").HeaderText = "L Ofer"
            dgrPrecios.Columns("IDPROVEEDOR").Visible = False
            dgrPrecios.Columns("PROVEEDOR").Visible = False
        End Sub

    Renzo Pique

    martes, 3 de octubre de 2017 18:34
  • Buenas Renzo,

    Efectivamente, accedes desde hilos que no son los que han creado el control, te voy a poner el cambio de un metodo, para que veas como deberias hacerlo

    Private Sub ConfigurarColumnasDataGrid()
            //Inicio el delegado
    	dgrPrecios.Invoke(New MethodInvoker(Sub() 
    	dgrPrecios.Columns("CODIGO").HeaderText = "Código"
    	dgrPrecios.Columns("DESCRIPCION").HeaderText = "Descripción"
    	dgrPrecios.Columns("CODIGOFABRICA").HeaderText = "Cod. Fábrica"
    	dgrPrecios.Columns("MONEDA").HeaderText = "Mon."
    	dgrPrecios.Columns("MONEDA").DefaultCellStyle.BackColor = Color.Purple
    	dgrPrecios.Columns("MONEDA").DefaultCellStyle.ForeColor = Color.White
    	dgrPrecios.Columns("MONEDA").DefaultCellStyle.SelectionBackColor = Color.Navy
    	dgrPrecios.Columns("MONEDA").DefaultCellStyle.SelectionForeColor = Color.White
    	dgrPrecios.Columns("PRECIOLISTA").HeaderText = "P. Lista"
    	dgrPrecios.Columns("PRECIOLISTA").DefaultCellStyle.BackColor = Color.LightCyan
    	dgrPrecios.Columns("CODIGODESCUENTO").HeaderText = "C. Dto."
    	dgrPrecios.Columns("DESCUENTO").HeaderText = "Descuento"
    	dgrPrecios.Columns("PLCD").Visible = False
    	dgrPrecios.Columns("FLETE").HeaderText = "% FL"
    	dgrPrecios.Columns("LISTA0").HeaderText = "P. Costo"
    	dgrPrecios.Columns("LISTA0").DefaultCellStyle.BackColor = Color.LightCyan
    	dgrPrecios.Columns("PH").HeaderText = "A"
    	dgrPrecios.Columns("PH").DefaultCellStyle.SelectionBackColor = Color.Navy
    	dgrPrecios.Columns("PH").DefaultCellStyle.SelectionForeColor = Color.Aqua
    	dgrPrecios.Columns("PH").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
    	dgrPrecios.Columns("LISTA1").HeaderText = "PL 1"
    	dgrPrecios.Columns("PORLISTA1").HeaderText = "%L 1"
    	dgrPrecios.Columns("LISTA1REL").Visible = False
    	dgrPrecios.Columns("LISTA2").HeaderText = "PL 2"
    	dgrPrecios.Columns("PORLISTA2").HeaderText = "%L 2"
    	dgrPrecios.Columns("LISTA2REL").Visible = False
    	dgrPrecios.Columns("LISTA3").HeaderText = "PL 3"
    	dgrPrecios.Columns("PORLISTA3").HeaderText = "%L 3"
    	dgrPrecios.Columns("LISTA3REL").Visible = False
    	dgrPrecios.Columns("LISTA4").HeaderText = "PL 4"
    	dgrPrecios.Columns("PORLISTA4").HeaderText = "%L 4"
    	dgrPrecios.Columns("LISTA4REL").Visible = False
    	dgrPrecios.Columns("LISTA5").HeaderText = "PL 5"
    	dgrPrecios.Columns("PORLISTA5").HeaderText = "%L 5"
    	dgrPrecios.Columns("LISTA5REL").Visible = False
    	dgrPrecios.Columns("LISTA6").HeaderText = "PL 6"
    	dgrPrecios.Columns("PORLISTA6").HeaderText = "%L 6"
    	dgrPrecios.Columns("LISTA6REL").Visible = False
    	dgrPrecios.Columns("LISTA7").HeaderText = "PL 7"
    	dgrPrecios.Columns("PORLISTA7").HeaderText = "%L 7"
    	dgrPrecios.Columns("LISTA7REL").Visible = False
    	dgrPrecios.Columns("LISTA8").HeaderText = "PL 8"
    	dgrPrecios.Columns("PORLISTA8").HeaderText = "%L 8"
    	dgrPrecios.Columns("LISTA8REL").Visible = False
    	dgrPrecios.Columns("LISTA9").HeaderText = "PL 9"
    	dgrPrecios.Columns("PORLISTA9").HeaderText = "%L 9"
    	dgrPrecios.Columns("LISTA9REL").Visible = False
    	dgrPrecios.Columns("LISTA10").HeaderText = "PL 10"
    	dgrPrecios.Columns("PORLISTA10").HeaderText = "%L 10"
    	dgrPrecios.Columns("LISTA10REL").Visible = False
    	dgrPrecios.Columns("IMPINT").HeaderText = "Imp Int"
    	dgrPrecios.Columns("ESOFERTA").HeaderText = "Oferta"
    	dgrPrecios.Columns("LISTAOFERTA").HeaderText = "L Ofer"
    	dgrPrecios.Columns("IDPROVEEDOR").Visible = False
    	dgrPrecios.Columns("PROVEEDOR").Visible = False
    
    End Sub)) //Termino el delegado
    End Sub

    Parece igual, pero si te fijas, no es el thread el que lo jecuta, sino que invoka un delegado para que sea el thread del interfaz el que lo cambie, esto es thread-safe.

    Ya se que es un trabajo cambiarlo todo en tu proyecto, pero esta es la manera correcta de acceder a controles desde otros hilos, y la manera de asegurarte de no recibir comportamientos inesperados.

    Si tienes dudas sobre como cambiar tu codigo, comentanos y te ayudamos

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:


    miércoles, 4 de octubre de 2017 8:09
  • Muchas Gracias Jorge, realmente ha sido de gran ayuda tu respuesta. 

    Ya que estoy te hago una última pregunta. Esos métodos que invoco y el hilo: mueren solos al finalizar el proceso? O hay que monitorearlos de alguna manera para liberar esos recursos?



    Renzo Pique

    jueves, 5 de octubre de 2017 20:37
  • una vez que acaban se liberan los recursos, pero ojo, el backgroundworker sigue sin liberarse hasta que tu lo dejes de referenciar, pero los recursos del DoWork se liberan.

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    jueves, 5 de octubre de 2017 20:58
  • Uia. Perdón, no lo comenté antes, cambié el BackgroundWorker y eliminé todos sus eventos por ésta simple línea:

    Me.Invoke(New Action(Sub()
                                     CargarArtCancel = New System.Threading.CancellationToken
                                     CargarArticulos = New Task(AddressOf ProcesarConsulta, CargarArtCancel, TaskCreationOptions.LongRunning)
                                     CargarArticulos.Start()
                                 End Sub))

    En mi caso logré hacer que eso trabaje mejor que el bw.

    Gracias.



    Renzo Pique

    jueves, 5 de octubre de 2017 21:07
  • Entonces si, una vez que se termina la tarea asincrona, se liberan los recursos aitomaticamente via GC

    Atte


    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    jueves, 5 de octubre de 2017 21:27