Foros del Web » Programación para mayores de 30 ;) » .NET »

Gurús (Ayuda prog. asincrónica C# 2.0)

Estas en el tema de Gurús (Ayuda prog. asincrónica C# 2.0) en el foro de .NET en Foros del Web. Buenas tardes gente... Estoy intentando cargar un ListBox mediante programación asíncrona (Se que puedo hacerlo através de una Thread) y me va todo de lujo, ...
  #1 (permalink)  
Antiguo 05/02/2007, 10:31
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Gurús (Ayuda prog. asincrónica C# 2.0)

Buenas tardes gente...

Estoy intentando cargar un ListBox mediante programación asíncrona (Se que puedo hacerlo através de una Thread) y me va todo de lujo, pero cuando acabo justo de cargar el ListBox, me sale el siguiente error:

"Referencia a objeto no establecida como instancia de un objeto."

Aun que ahora no aparezcan, he probado a poner Try en cada parte del código en (button2_Click, LlenarElementosLista y en ResultadoOperacion) y en ninguna de ellas ha entrado en la excepción.

Este es el código:
Código:
        public delegate void LlenarLista();
        LlenarLista delegado;
        private void button2_Click(object sender, EventArgs e)
        {
            delegado = new LlenarLista(LlenarElementosLista);
            IAsyncResult iaResultado = delegado.BeginInvoke(new AsyncCallback(ResultadoOperacion), null);
        }

        [OneWay]
        private void LlenarElementosLista()
        {
            lsLista.Items.Clear();
            for (Int64 i = 0; i < 3; i++){
                if (i == 99999)
                    lsLista.Items.Add("Elemento " + i.ToString());
                else
                    lsLista.Items.Add("Elemento " + i.ToString());
            }
        }

        private void ResultadoOperacion(IAsyncResult ar)
        {
            delegado.EndInvoke(ar);
        }
También decirles que en el Inicio del formulario tengo puesta la etiqueta CheckForIllegalCrossThreadCalls = false; ya que sino, me fallaría nada más empezar el método. Pero... no entiendo y no sé por que me está fallando al finalizar, por favor, si alguien tiene experiencia en temas de Asincronía le agradecería enormemente que me saque de este bache.
__________________
Charlie.
  #2 (permalink)  
Antiguo 05/02/2007, 12:30
Avatar de davidel  
Fecha de Ingreso: noviembre-2006
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: Gurús (Ayuda prog. asincrónica C# 2.0)

Prueba con esto y me comentas

public delegate void AddListItemCallback(string text);
private AddListItemCallback addListItemCallback;

[System.Runtime.Remoting.Messaging.OneWay]
private void LlenarElementosLista()
{
lsLista.Items.Clear();
for (Int64 i = 0; i < 5; i++)
{
if(this.InvokeRequired)
{
lsLista.Invoke(addListItemCallback, new object[] {"Elemento " + i.ToString()});
}
else
{
lsLista.Items.Add("Elemento " + i.ToString());
}
}
}
  #3 (permalink)  
Antiguo 05/02/2007, 12:31
Avatar de davidel  
Fecha de Ingreso: noviembre-2006
Mensajes: 17
Antigüedad: 17 años, 5 meses
Puntos: 0
Re: Gurús (Ayuda prog. asincrónica C# 2.0)

Perdona, se me olvidó pegarte algo de código, aqui lo tienes completo en base a lo que tu mandaste

public delegate void LlenarLista();
public delegate void AddListItemCallback(string text);
private AddListItemCallback addListItemCallback;

LlenarLista delegado;
private void button1_Click(object sender, System.EventArgs e)
{
delegado = new LlenarLista(LlenarElementosLista);
addListItemCallback = new AddListItemCallback(this.AddListItem);
IAsyncResult iaResultado = delegado.BeginInvoke(new AsyncCallback(ResultadoOperacion), null);
}

[System.Runtime.Remoting.Messaging.OneWay]
private void LlenarElementosLista()
{
lsLista.Items.Clear();
for (Int64 i = 0; i < 5; i++)
{
if(this.InvokeRequired)
{
lsLista.Invoke(addListItemCallback, new object[] {"Elemento " + i.ToString()});
}
else
{
lsLista.Items.Add("Elemento " + i.ToString());
}
}
}

private void AddListItem(string text)
{
this.lsLista.Items.Add(text);
}

private void ResultadoOperacion(IAsyncResult ar)
{
delegado.EndInvoke(ar);
}
  #4 (permalink)  
Antiguo 05/02/2007, 16:52
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Re: Gurús (Ayuda prog. asincrónica C# 2.0)

No lo probé todavía amigo, pero... podrías explicarme un poco el código, por favor ?
__________________
Charlie.
  #5 (permalink)  
Antiguo 05/02/2007, 19:57
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Re: Gurús (Ayuda prog. asincrónica C# 2.0)

El código mostrado lo que hace, lo que hace es evitar los bloqueos que puedan existir entre las hebras que participan en esa operación.

De la documentación sobre InvokeRequired:
Cita:
Los controles de formularios Windows Forms están enlazados a un subproceso específico y no son seguros para la ejecución de subprocesos. Por lo tanto, si se llama a un método de un control desde un subproceso diferente, debe utilizarse uno de los métodos de invocación del control para calcular las referencias de la llamada al subproceso adecuado. Esta propiedad puede utilizarse para determinar si debe llamarse a un método de invocación, lo que puede resultar útil si se desconocen los subprocesos que poseen un control.
Para más detalles, dale una lectura al link que te pasé hace algunos días.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #6 (permalink)  
Antiguo 06/02/2007, 03:28
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Re: Gurús (Ayuda prog. asincrónica C# 2.0)

Muchas gracias a ambos chicos, todavía no he tenido la oportundiad de probarlo, haber si cogo un hueco en el trabajo...

Pero gracias a vosotros creo que he aprendido una buena lección. Muchas gracias compañeros.
__________________
Charlie.
  #7 (permalink)  
Antiguo 06/02/2007, 03:46
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 meses
Puntos: 7
Re: Gurús (Ayuda prog. asincrónica C# 2.0)

Bueno gente... no podía aguantarme más y lo probé...

Por desgracia, siento comunicaros que el error persiste, además de que deshabilitando el CheckForIllegalCrossThreadCalls también falla. Por ahora lo tengo a true, e intenté ejecutar el siguiente código:

Código:
        public delegate void LlenarLista();
        LlenarLista delegado;

        public delegate void AddListItemCallback(string text);
        private AddListItemCallback addListItemCallback;
        private void button2_Click(object sender, EventArgs e)
        {
            addListItemCallback = new AddListItemCallback(this.AddListItem);
            delegado = new LlenarLista(LlenarElementosLista);
            IAsyncResult iaResultado = delegado.BeginInvoke(new AsyncCallback(ResultadoOperacion), null);
        }

        [OneWay]
        private void LlenarElementosLista()
        {
            lsLista.Items.Clear();
            for (Int64 i = 0; i < 3; i++){
                if (this.InvokeRequired)
                    lsLista.Invoke(addListItemCallback, new object[] { "Elemento " + i.ToString() });
                else
                    lsLista.Items.Add("Elemento " + i.ToString());
            }
        }
        private void AddListItem(string text)
        {
            this.lsLista.Items.Add(text);
        }
        private void ResultadoOperacion(IAsyncResult ar)
        {
            delegado.EndInvoke(ar);
        }
Despues también intentaré pelearme para que no sea necesario el CheckForIllegalCrossThreadCalls, haber si conseguimos uasr controles de forma background y "Legalmente".

Un abrazo foreros.
__________________
Charlie.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:17.