Come lo ridurreste/ottimizzereste queste 12 righe di codice ? (Delegate)

di il
4 risposte

Come lo ridurreste/ottimizzereste queste 12 righe di codice ? (Delegate)

Come riuscireste a scrivere lo stesso codice in meno righe possibili ?
Ammesso anche C# 10. Lamba ovviamente ben accetti.

namespace ...
{
    public partial class Form1 : Form
    {
    ...
    
        private Thread threadProgresBar = null;
        private delegate void SafeCallDelegate();

        private void wwMeteo_FrameLoadStart(object sender, FrameLoadStartEventArgs e)
        {
            threadProgresBar = new Thread(new ThreadStart(ProgresBarStart));
            threadProgresBar.Start();
        }

        private void ProgresBarStart()
        {
            if (pbMeteo.InvokeRequired)
            {
                var d = new SafeCallDelegate(ProgresBarStart);
                pbMeteo.Invoke(d, new object[] { });
            }
            else
            {
                pbMeteo.Enabled = true;
                pbMeteo.Visible = true;
            }
        }
        
        ...

4 Risposte

  • Re: Come lo ridurreste/ottimizzereste queste 12 righe di codice ? (Delegate)

    Non ne capisco il senso né comprendo l'utilità.
  • Re: Come lo ridurreste/ottimizzereste queste 12 righe di codice ? (Delegate)

    Si, in effetti la ho impostata malissimo.
    Quello che mi mette in crisi, cioè che vorrei capire la logica comportamentale, è la seguente riga:
    var d = new SafeCallDelegate(ProgresBarStart);

    Ti riassumo cosa accade fino a dove capisco, poi prosegui tu/voi.
    Premetto che il codice funziona egregiamente, per cui vorrei solo capire il concetto di quella benedetta riga + (vedi Question 1 più avanti).

    Si scatena l'evento wwMeteo_FrameLoadStart del componente CEF, che avviene all'atto del caricamento della pagina web.
    Quando avviene questo evento ho bisogno di gestire la UI della mia App. Ma questo non mi è possibile farlo dentro questo evento perché VisualStudio mi solleva un eccezione: la modifica del componente progressBar utilizza un thread diverso.
    Ed infatti a conferma di ciò la documentazione di CEF recita:
    It's important to note this event is fired on a CEF UI thread, which by default is not the same as your application UI thread. It is unwise to block on this thread for any length of time as your browser will become unresponsive and/or hang.. To access UI elements you'll need to Invoke/Dispatch onto the UI Thread.
    Per cui quello che ci interessa é: To access UI elements you'll need to Invoke/Dispatch onto the UI Thread.

    A questo punto dichiaro un Thread ed un Delegate:
    private Thread threadProgresBar = null;
    private delegate void SafeCallDelegate();

    E dentro l'evento wwMeteo_FrameLoadStart ci istanzio e faccio avviare il thread con queste due righe:
    threadProgresBar = new Thread(new ThreadStart(ProgresBarStart));
    threadProgresBar.Start();

    QUESTION 1.
    Ho il thread threadProgresBar che è stato dichiarato nella Classe Form1, ma istanziato all'interno dell'evento wwMeteo_FrameLoadStart.
    Potrei avanzare l'ipotesi: anche se è stato istanziato all'interno dell'evento wwMeteo_FrameLoadStart, il compilatore lo vede comunque come due distinti thread perché lo ho dichiarato nella Classe Form1 ?
    Oppure due thread, ovunque li dichiari, ovunque le istanzio, sono sempre distinti ?
    Il codice sorgente come lo impostato funziona alla grande, per cui il dubbio è capire come viene visto il mio thread..



    Poi, il Thread parte ed esegue la funzione ProgresBarStart.
    Questa funzione semplicemente Abilita e Visualizza la progresBar.
    Ma la Documentazione .Net mi suggerisce di usare InvokeRequired, che controlla se il thread che sto utilizzando è un thread dalla mia App (che appunto può gestire la UI).
    Se si, ok, tutto apposto. Se invece il Thread che eseguo si trova all'interno di un Thread che non è il principale della mia App (ed appunto non può gestire l'interfaccia grafica), devo fare:
    var d = new SafeCallDelegate(ProgresBarStart);
    pbMeteo.Invoke(d, new object[] { });
    e cioè mi istanzio il Delegate "d" e poi..
    la progresBar invoca il delegato "d", e come parametri passa UN ARRAY DI NUOVI OGGETTI...

    QUESTION 2.
    che sta facendo il compilarore con ".Invoke(d, new object[] { });" ?


    Ora sono stato preciso.. ansi.. precisissimo

    Mi date una mano a capire?

    Grazie.


    *******************************************************************************************************************
    [ADD]
    Avendo 2 ProgressBar per due browser ho modificato il metodo
    private void ProgresBarStart()
    IN
    private void ProgresBarStart(ProgressBar progBar)

    ed ovviamente anche
    threadProgresBar = new Thread(new ThreadStart(ProgresBarStart));
    IN
    threadProgresBar = new Thread(new ThreadStart(ProgresBarStart(Form1.pbMeteo)));

    VS mi risponde con il seguente errore:

    E' necessario un riferimento all'oggetto per la proprietà, il metodo o il campo non statico 'Form2.Meteo'.

    Come posso passare per cui un componente alla funzione ProgresBarStart ?
  • Re: Come lo ridurreste/ottimizzereste queste 12 righe di codice ? (Delegate)

    Forse con new Action è più comprensibile:
    
            private void RoutineSuThreadIndipendente()
            {
                Invoke(new Action(() =>
                {
                    Cursor = Cursors.WaitCursor; // accesso alla UI con thread diverso
                }));
    
                // un banale ciclo
                for (int a = 1; a <= progressBar1.Maximum; a++)
                {
                    Invoke(new Action(() =>
                    {
                        this.Text = a.ToString(); // accesso alla UI con thread diverso
                        progressBar1.Value = a; // accesso alla UI con thread diverso
                    }));
                }
                // fine ciclo
                
                Invoke(new Action(() =>
                {
                      Cursor = Cursors.Arrow; // accesso alla UI con thread diverso
                }));
            }
  • Re: Come lo ridurreste/ottimizzereste queste 12 righe di codice ? (Delegate)

    Si Rubik.
Devi accedere o registrarti per scrivere nel forum
4 risposte