· Andrés Ledo · NET  · Lectura en 2 min

C#: Solución: Operación no valida a través de subprocesos .NET

A veces tenemos la necesidad de ejecutar procesos que pueden tardar mucho tiempo, por ejemplo cuando realizamos algún proceso de sincronización, en este caso estamos obligados a recurrir a los subprocesos para evitar que nuestra aplicación se cuelgue.

A veces tenemos la necesidad de ejecutar procesos que pueden tardar mucho tiempo, por ejemplo cuando realizamos algún proceso de sincronización, en este caso estamos obligados a recurrir a los subprocesos para evitar que nuestra aplicación se cuelgue.

El problema lo tenemos cuando desde este subproceso tiene que interactuar con controles, que nos encontramos el siguiente error:

System.InvalidOperationException: ‘El subproceso que realiza la llamada no puede obtener acceso a este objeto porque el propietario es otro subproceso.’

Bien, ¿Cómo lo solucionamos?

Provocando el error

Para que veas un ejemplo práctico he creado una aplicación muy sencilla, simplemente cuenta hasta 100 y en cada paso va llenando un progress bar y un label. Para ver el movimiento del progress bar recurrimos al subproceso. El código sería el siguiente:

private void btnEjecutar_Click(object sender, RoutedEventArgs e)
        {          
            Thread trd = new Thread(new ThreadStart(Count));
            trd.IsBackground = true;
            trd.Start();
        }
private void Count()
        {
            for (int i = 1; i < 101; i++)
            {
                pbProgress.Value = i;
                lblCounter.Content = $"{i} de 100";
                Task.Delay(1000).Wait();
            }
        }

La interfaz sería algo así:

Interfaz app

Si compilamos la aplicación y pulsamos sobre el botón veremos el famoso error:

Error app

Solución al error

Para solucionar este error debemos hacer las modificaciones de los controles dentro del siguiente código:

this.Dispatcher.Invoke(() =>
{
      //Modificaciones sobre los controles
});

Gracias a este simple código podemos acceder a los controles desde el propio subproceso, por lo que ya podemos actualizar la barra de progreso y el label. Finalmente, nuestro código funcional sería el siguiente:

private void btnEjecutar_Click(object sender, RoutedEventArgs e)
        {          
            Thread trd = new Thread(new ThreadStart(Count));
            trd.IsBackground = true;
            trd.Start();
        }
private void Count()
        {
            for (int i = 1; i < 101; i++)
            {
                this.Dispatcher.Invoke(() =>
                {
                    pbProgress.Value = i;
                    lblCounter.Content = $"{i} de 100";
                });
                
                Task.Delay(1000).Wait();
            }
        }

Para acabar el artículo, si estás pensando en comprar hosting o en comprar dominio Web, déjame recomendarte estos artículos:

    Compartir
    Volver al blog

    Artículos relacionados

    Ver todos los artículos »
    PHP strpos

    PHP strpos

    La función "strpos" es una de las más utilizadas en PHP y es muy útil para buscar la posición de una subcadena dentro de una cadena de texto..

    Validar DNI, NIE y CIF online

    Validar DNI, NIE y CIF online

    En España, validar la autenticidad de documentos como el DNI, NIE y CIF es crucial para cumplir con las regulaciones y prevenir fraudes. Las...

    Cómo usar los comentarios en PHP

    Cómo usar los comentarios en PHP

    Mejora tu código PHP con nuestra guía definitiva sobre comentarios. ¡Descubre técnicas eficientes y buenas prácticas para llevar tus proyectos al...

    Switch en C#: Guía Completa

    Switch en C#: Guía Completa

    La estructura switch ofrece una alternativa más limpia y organizada a múltiples if-else encadenados, permitiendo a los programadores gestionar varias...

    Bucle while en PHP

    Bucle while en PHP

    Aprende como funciona el bucle while en PHP con algunos ejemplos sencillos de entender.