Thread principale e secondario

di il
6 risposte

Thread principale e secondario

Ciao ragazzi, ho questa situazione. C'è un'operazione che eseguo e durante la quale una progressbar mostra l'avanzamento.
In sostanza è un' app windows form, dove ho una tabpage e un usercontrol inserito dove ho la progressbar e sempre nel control un bottone di stop.
Se lancio la mia funzione dal windows form in un thread separato, ovviamente il metodo lanciato non può aggiornare variabili perchè non è un'operazione crossthread safe. Come posso fare?
Allegati:
32529_abfa719ce406cea67ff00a2db2c26fe0.png
32529_abfa719ce406cea67ff00a2db2c26fe0.png

6 Risposte

  • Re: Thread principale e secondario

    Ho scoperto che un modo che evita che questo accada è settare nel load form la proprietà:

    CheckForIllegalCrossThreadCalls = false

    E' una pratica corretta?
  • Re: Thread principale e secondario

    dareiosto ha scritto:


    Ho scoperto che un modo che evita che questo accada è settare nel load form la proprietà:
    CheckForIllegalCrossThreadCalls = false
    E' una pratica corretta?
    In poche parole, è un po' come avere il ladro che ti entra in casa facendo suonare l'allarme, e tu hai spento solo l'allarme.

    dareiosto ha scritto:


    Se lancio la mia funzione dal windows form in un thread separato, ovviamente il metodo lanciato non può aggiornare variabili perchè non è un'operazione crossthread safe. Come posso fare?
    Devi pubblicare l'aggiornamento mettendolo nella coda principale dell'applicazione, oppure - meglio - con un timer a bassa priorità vai a leggere periodicamente il valore raggiunto della progressione del processo e lo visualizzi.

    In poche parole, invece di scrivere dal thread secondario a quello primario, nel secondario aggiorni solo un valore e dal primario te lo vai esclusivamente a leggere.

    Ciao!
  • Re: Thread principale e secondario

    Un'alternativa è quella di scrivere un metodo per l'accesso al controllo grafico (in questo caso la progress bar) che possa essere richiamato da qualsiasi thread.
    Questo metodo verificherà, tramite la proprietà InvokeRequired, se l'accesso al controllo avviene da un thread diverso da quello in cui è stato creato il controllo stesso: in questo caso richiamerà Invoke() che permette di eseguire una funzione all'interno del thread dell'interfaccia grafica.
    A questo link trovi un esempio che secondo me calza a pennello per il tuo caso https://stackoverflow.com/questions/43337754/c-sharp-update-ui-from-different-class-thread.
    Riporto qui sotto il metodo di cui parlavo, che potrai richiamare da qualsiasi thread:
    public void UpdateProgressBar(int value)
    {
       if(progressBar1.InvokeRequired){
           progressBar1.Invoke(new MethodInvoker(() => progressBar1.Value=value));
       }else{
           progressBar1.Value =value;
       }
    }
  • Re: Thread principale e secondario

    Grazie mille proverò.
    Mi è piaciuto l'esempio del ladro
    Ma eventualmente in quel modo l'eccezione viene lanciata lo stesso e non viene segnalata o proprio non viene lanciata con il metodo brutto mio?

    Grazie
  • Re: Thread principale e secondario

    dareiosto ha scritto:


    Ma eventualmente in quel modo l'eccezione viene lanciata lo stesso e non viene segnalata o proprio non viene lanciata con il metodo brutto mio?
    Non ne ho idea, perché ho sempre evitato di cadere in quella casistica.
  • Re: Thread principale e secondario

    Ti ringrazio molto, non mi è servito nemmeno l'altro link perchè usando il tuo metodo anche con altri controlli che generavano l'eccezione adesso funziona tutto.
Devi accedere o registrarti per scrivere nel forum
6 risposte