Control.Invoke Method (Delegate)
Executes the specified delegate on the thread that owns the control's underlying window handle.
Namespace: System.Windows.Forms
Assembly: System.Windows.Forms (in System.Windows.Forms.dll)
Parameters
- method
- Type: System.Delegate
A delegate that contains a method to be called in the control's thread context.
Return Value
Type: System.ObjectThe return value from the delegate being invoked, or Nothing if the delegate has no return value.
Delegates are similar to function pointers in C or C++ languages. Delegates encapsulate a reference to a method inside a delegate object. The delegate object can then be passed to code that calls the referenced method, and the method to be invoked can be unknown at compile time. Unlike function pointers in C or C++, delegates are object-oriented, type-safe, and more secure.
The Invoke method searches up the control's parent chain until it finds a control or form that has a window handle if the current control's underlying window handle does not exist yet. If no appropriate handle can be found, the Invoke method will throw an exception. Exceptions that are raised during the call will be propagated back to the caller.
Note |
|---|
In addition to the InvokeRequired property, there are four methods on a control that are thread safe: Invoke, BeginInvoke, EndInvoke, and CreateGraphics if the handle for the control has already been created. Calling CreateGraphics before the control's handle has been created on a background thread can cause illegal cross thread calls. For all other method calls, you should use one of the invoke methods to marshal the call to the control's thread. |
The delegate can be an instance of EventHandler, in which case the sender parameter will contain this control, and the event parameter will contain EventArgs.Empty. The delegate can also be an instance of MethodInvoker, or any other delegate that takes a void parameter list. A call to an EventHandler or MethodInvoker delegate will be faster than a call to another type of delegate.
Note |
|---|
An exception might be thrown if the thread that should process the message is no longer active. |
The following code example shows controls that contain a delegate. The delegate encapsulates a method that adds items to the list box, and this method is executed on the thread that owns the underlying handle of the form. When the user clicks on the button, Invoke runs the delegate.
' The following example demonstrates the 'Invoke(Delegate)' method of 'Control class. ' A 'ListBox' and a 'Button' control are added to a form, containing a delegate ' which encapsulates a method that adds items to the listbox.This function is executed ' on the thread that owns the underlying handle of the form. When user clicks on button ' the above delegate is executed using 'Invoke' method. Imports System Imports System.Drawing Imports System.Windows.Forms Imports System.Threading Public Class MyFormControl Inherits Form Delegate Sub AddListItem() Public myDelegate As AddListItem Private myButton As Button Private myThread As Thread Private myListBox As ListBox Public Sub New() 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" AddHandler myButton.Click, AddressOf 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(AddressOf AddListItemMethod) End Sub 'New Shared Sub Main() Dim myForm As New MyFormControl() myForm.ShowDialog() End Sub 'Main Public Sub AddListItemMethod() Dim myItem As String Dim i As Integer For i = 1 To 5 myItem = "MyListItem" + i.ToString() myListBox.Items.Add(myItem) myListBox.Update() Thread.Sleep(300) Next i End Sub 'AddListItemMethod Private Sub Button_Click(sender As Object, e As EventArgs) myThread = New Thread(New ThreadStart(AddressOf ThreadFunction)) myThread.Start() End Sub 'Button_Click Private Sub ThreadFunction() Dim myThreadClassObject As New MyThreadClass(Me) myThreadClassObject.Run() End Sub 'ThreadFunction End Class 'MyFormControl ' The following code assumes a 'ListBox' and a 'Button' control are added to a form, ' containing a delegate which encapsulates a method that adds items to the listbox. Public Class MyThreadClass Private myFormControl1 As MyFormControl Public Sub New(myForm As MyFormControl) myFormControl1 = myForm End Sub 'New Public Sub Run() ' Execute the specified delegate on the thread that owns ' 'myFormControl1' control's underlying window handle. myFormControl1.Invoke(myFormControl1.myDelegate) End Sub 'Run End Class 'MyThreadClass
Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)
The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Note