none
Apertura Form Lenta RRS feed

  • Domanda

  • Salve a tutti,

    ho un form con 504 label le quali hanno tutte come riferimento un evento sul click.

    Prima di associare questo evento a tutte le label il form si apriva molto velocemente, in maniera naturale;

    non appena ho collegato l'evento sul click di ogni label, quando vado ad aprire il form ora ci mette molto di più...

    C'è un modo per poter risolvere?

    mercoledì 17 febbraio 2016 16:16

Risposte

  • Il problema non è l'handler dell'evento, ma il modo in cui viene fatto il bind tra label ed evento.

    Lasciando fare al designer, il codice viene generato automaticamente ed eseguito in modo sincrono nel costruttore del form.

    Prova a mettere nell'evento load una chiamata a una funzione fatta così (aggiustala in base al tuo caso specifico)

    private async void BindEventsAsync()
    {
       foreach(var lbl in labels) // labels sarà la collection di label nel tuo form
       {
          lbl.Click += label_Click;      
          await Task.Delay(10);
       }
    }

    Non è il massimo della vita, ma per lo meno dovresti avere un'apertura istantanea del form.


    Matteo Marcianò - founder of ByteStorms

    lunedì 22 febbraio 2016 18:42

Tutte le risposte

  • Buon pomeriggio Cristian,
    ti consiglio di utilizzare un Task separato che esegua in maniera asincrona le operazioni su tutte le label.
    Qui trovi un esempio sia per il web che per desktop,
    ciao



    Paolo Pranzo

    mercoledì 17 febbraio 2016 16:37
  • in seguito alla tua indicazione ho provveduto a modificare l'evento come segue:

    private async void label_Click(object sender, EventArgs e)
            {
                await Task.Delay(40);
                string chbxName = ((Label)sender).Name;
    
                string senderString = sender.ToString();
                string day = senderString.Substring(33);
                if (day != " ")
                {
                    if (cmdDipendente.Text == "")
                    {
                        MessageBox.Show("Nessun Dipendente Selezionato", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        nuovaAssenza = new NuovaAssenza(this, chbxName, day);
                        nuovaAssenza.ShowDialog();
                    }
                }
                
            }

    ma i tempi di apertura sono comunque alti....

    premetto che questo evento viene eseguito soltanto sul click di ogni label

    lunedì 22 febbraio 2016 16:17

  • ma i tempi di apertura sono comunque alti....

    premetto che questo evento viene eseguito soltanto sul click di ogni label

    Notevolmente ridotti direi! Altrimenti non hai scritto correttamente il codice.
    Saluti


    Paolo Pranzo


    lunedì 22 febbraio 2016 16:43
  • Il problema non è l'handler dell'evento, ma il modo in cui viene fatto il bind tra label ed evento.

    Lasciando fare al designer, il codice viene generato automaticamente ed eseguito in modo sincrono nel costruttore del form.

    Prova a mettere nell'evento load una chiamata a una funzione fatta così (aggiustala in base al tuo caso specifico)

    private async void BindEventsAsync()
    {
       foreach(var lbl in labels) // labels sarà la collection di label nel tuo form
       {
          lbl.Click += label_Click;      
          await Task.Delay(10);
       }
    }

    Non è il massimo della vita, ma per lo meno dovresti avere un'apertura istantanea del form.


    Matteo Marcianò - founder of ByteStorms

    lunedì 22 febbraio 2016 18:42
  • Tieni comunque presente che tante istanze di label in uno stesso form non è mai una buona idea. Una buona listbox con virtualizzazione sarebbe l'ideale (se stai usando WPF)

    Matteo Marcianò - founder of ByteStorms

    lunedì 22 febbraio 2016 18:44