Esporta (0) Stampa
Espandi tutto
Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale

Metodo Control.Invoke (Delegate, Object[])

Consente di eseguire il delegato specificato nel thread proprietario dell'handle di finestra sottostante del controllo con l'elenco di argomenti specificato.

Spazio dei nomi:  System.Windows.Forms
Assembly:  System.Windows.Forms (in System.Windows.Forms.dll)

public Object Invoke(
	Delegate method,
	params Object[] args
)

Parametri

method
Tipo: System.Delegate
Delegato di un metodo che accetta parametri dello stesso tipo e numero contenuti nel parametro args.
args
Tipo: System.Object[]
Matrice di oggetti da passare come argomenti al metodo specificato. Se il metodo non accetta alcun argomento, questo parametro può essere null.

Valore restituito

Tipo: System.Object
Oggetto Object che contiene il valore restituito dal delegato richiamato oppure null se il delegato non restituisce alcun valore.

Implementa

ISynchronizeInvoke.Invoke(Delegate, Object[])

I delegati sono simili ai puntatori a funzione del linguaggio C o C++. Essi consentono di incapsulare un riferimento a un metodo in un oggetto delegato. L'oggetto delegato può quindi essere passato al codice, che a sua volta chiama il metodo a cui viene fatto riferimento, anche se il metodo da richiamare risulta sconosciuto in fase di compilazione. A differenza dei puntatori a funzione in C o C++, i delegati sono orientati a oggetti, indipendenti dai tipi e offrono una maggiore sicurezza.

Se l'handle del controllo non esiste ancora, il metodo cerca nella catena padre del controllo finché non trova un controllo o un form che dispone di un handle di finestra. Se non è possibile trovare un handle appropriato, il metodo genera un'eccezione. Le eccezioni generate durante la chiamata verranno ritrasmesse al chiamante.

NotaNota

Oltre alla proprietà InvokeRequired, in un controllo sono disponibili quattro metodi thread-safe: Invoke, BeginInvoke, EndInvoke e CreateGraphics se l'handle per il controllo è già stato creato. Se si chiama CreateGraphics prima di avere creato l'handle del controllo su un thread in background, si possono provocare chiamate tra thread non valide. Per tutte le altre chiamate di metodo, è necessario utilizzare uno dei metodi Invoke per effettuare il marshalling della chiamata al thread del controllo.

Il delegato può essere un'istanza di EventHandler; in questo caso, il parametro che effettua l'invio conterrà questo controllo, mentre il parametro dell'evento conterrà EventArgs.Empty. Il delegato può anche essere un'istanza di MethodInvoker o un altro delegato che riceve un elenco di parametri void. Una chiamata a un delegato EventHandler o MethodInvoker risulterà più rapida di una chiamata a un altro tipo di delegato.

NotaNota

Se il thread che deve elaborare il messaggio non è più attivo, potrà essere generata un'eccezione.

Nell'esempio di codice riportato di seguito vengono illustrati i controlli che contengono un delegato. Il delegato incapsula un metodo che aggiunge gli elementi alla casella di riepilogo e questo metodo viene eseguito sul thread proprietario dell'handle sottostante del form utilizzando gli argomenti specificati. Quando l'utente fa clic sul pulsante, Invoke esegue il delegato.


using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

   public class MyFormControl : Form
   {
      public delegate void AddListItem(String myString);
      public AddListItem myDelegate;
      private Button myButton;
      private Thread myThread;
      private ListBox myListBox;
      public MyFormControl()
      {
         myButton = new Button();
         myListBox = new ListBox();
         myButton.Location = new Point(72, 160);
         myButton.Size = new Size(152, 32);
         myButton.TabIndex = 1;
         myButton.Text = "Add items in list box";
         myButton.Click += new EventHandler(Button_Click);
         myListBox.Location = new Point(48, 32);
         myListBox.Name = "myListBox";
         myListBox.Size = new Size(200, 95);
         myListBox.TabIndex = 2;
         ClientSize = new Size(292, 273);
         Controls.AddRange(new Control[] {myListBox,myButton});
         Text = " 'Control_Invoke' example ";
         myDelegate = new AddListItem(AddListItemMethod);
      }
      static void Main()
      {
         MyFormControl myForm = new MyFormControl();
         myForm.ShowDialog();
      }
      public void AddListItemMethod(String myString)
      {
            myListBox.Items.Add(myString);
      }
      private void Button_Click(object sender, EventArgs e)
      {
         myThread = new Thread(new ThreadStart(ThreadFunction));
         myThread.Start();
      }
      private void ThreadFunction()
      {
         MyThreadClass myThreadClassObject  = new MyThreadClass(this);
         myThreadClassObject.Run();
      }
   }
   public class MyThreadClass
   {
      MyFormControl myFormControl1;
      public MyThreadClass(MyFormControl myForm)
      {
         myFormControl1 = myForm;
      }
      String myString;

      public void Run()
      {


         for (int i = 1; i <= 5; i++)
         {
            myString = "Step number " + i.ToString() + " executed";
            Thread.Sleep(400);
            // Execute the specified delegate on the thread that owns
            // 'myFormControl1' control's underlying window handle with
            // the specified list of arguments.
            myFormControl1.Invoke(myFormControl1.myDelegate,
                                   new Object[] {myString});
         }
      }
   }


.NET Framework

Supportato in: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

Aggiunte alla community

AGGIUNGI
Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione degli utenti in merito al sito Web di MSDN. Se si sceglie di partecipare, quando si lascia il sito Web di MSDN verrà visualizzato il sondaggio in linea.

Si desidera partecipare?
Mostra:
© 2015 Microsoft