Procedura: modificare i controlli dai thread

Benché il componente BackgroundWorker sostituisca il metodo BeginInvoke precedente aggiungendo funzionalità, il metodo BeginInvoke viene mantenuto per compatibilità con le versioni precedenti e per utilizzo futuro se lo si desidera. Per ulteriori informazioni vedere Cenni preliminari sul componente BackgroundWorker.

Il multithreading è particolarmente adatto all'esecuzione delle routine dei moduli di classe che richiedono un utilizzo intensivo del processore. A differenza di altri componenti, le chiamate dirette ai metodi nei controlli da thread distinti comporta l'insorgenza di specifici problemi. I metodi che influiscono sui controlli devono essere eseguiti solo sul thread su cui è stato creato il controllo. Poiché il marshalling delle chiamate da un thread e l'invio di queste chiamate oltre i limiti dei thread a un altro thread sono operazioni molto dispendiose in termini di risorse di sistema, si consiglia di evitare di eseguire ripetutamente chiamate ai controlli su altri thread. Nella migliore delle ipotesi, le chiamate dirette eseguite da altri thread sono dispendiose e possono provocare un rallentamento delle prestazioni dell'applicazione. Nella peggiore delle ipotesi, si potrebbero verificare dei deadlock in grado di determinare il blocco dell'esecuzione.

Tuttavia è possibile che in alcune situazioni sia necessario chiamare i metodi dei controlli dai thread. Si supponga ad esempio di chiamare un metodo che disabilita un pulsante o aggiorna gli elementi visualizzati in un form in risposta all'azione eseguita da un thread. In .NET Framework sono disponibili metodi che possono essere chiamati da qualsiasi thread per richiamare metodi che interagiscono con i controlli posseduti da altri thread. Il metodo Invoke consente l'esecuzione sincrona dei metodi dei controlli, mentre il metodo BeginInvoke avvia l'esecuzione asincrona. Per utilizzare questi metodi, è necessario dichiarare un delegato con la stessa firma del metodo da richiamare. Sarà quindi possibile chiamare il metodo Invoke o BeginInvoke di qualsiasi controllo del form fornendo il delegato appropriato al metodo che si desidera chiamare. Gli eventuali parametri necessari vengono inseriti in un Object e trasmessi al metodo.

Per richiamare metodi che utilizzano controlli da altri thread

  1. Dichiarare un delegato con una firma identica al metodo che si desidera richiamare.

    Nell'esempio che segue viene illustrato come dichiarare un delegato con i parametri Integer e String.

    Public Delegate Sub myDelegate(ByVal anInteger as Integer, ByVal _
       aString as String)
    
    public delegate void myDelegate(int anInteger, string aString);
    
  2. Utilizzare eventuali controlli per richiamare i metodi che modificano i controlli posseduti da altri thread.

    Nota

    È possibile fornire gli eventuali parametri richiesti dal metodo all'interno di un Object.

    • Se si desidera richiamare i metodi in modalità sincrona, chiamare il metodo Control.Invoke.

      Label1.Invoke(New myDelegate(AddressOf myMethod), New _
         Object() {1, "This is the string"})
      
      Label1.Invoke(new myDelegate(myMethod), new Object[] {1,
         "This is the string"});
      
    • Se si desidera richiamare i metodi in modalità asincrona, chiamare il metodo Control.BeginInvoke.

      Label1.BeginInvoke(New myDelegate(AddressOf myMethod), _
         New Object() {1, "This is the string"})
      
      Label1.BeginInvoke(new myDelegate(myMethod), new 
      Object[] {1, "This is the string"});
      

Vedere anche

Attività

Procedura dettagliata: modifica di componenti multithreading semplici con Visual Basic

Procedura dettagliata: modifica di componenti multithreading semplici con Visual C#

Riferimenti

BackgroundWorker

Concetti

Cenni preliminari sul modello asincrono basato su eventi

Altre risorse

Multithreading nei componenti