IAsyncResult.AsyncState Property
Gets a user-defined object that qualifies or contains information about an asynchronous operation.
Assembly: mscorlib (in mscorlib.dll)
Property Value
Type: System.ObjectA user-defined object that qualifies or contains information about an asynchronous operation.
This property returns the object that is the last parameter of the method that initiates an asynchronous operation.
Notes to Implementers:
Implement this property to allow the caller of an asynchronous operation to obtain an application-defined object specified at the start of the operation.
Notes to Callers:
This object can be used to pass state information for the asynchronous operation to an AsyncCallback that you provide.
The following code example demonstrates how the AsyncState property is used to pass information to a callback method. The last parameter of the BeginInvoke method call is a format string, which the callback method uses to format an output message.
The example consists of two classes: the class that contains the method that is called asynchronously, and the class that contains the Main method that makes the call.
For more information about how this callback example works, and more examples of calling methods asynchronously by using delegates, see Calling Synchronous Methods Asynchronously.
Imports System Imports System.Threading Imports System.Runtime.InteropServices Namespace Examples.AdvancedProgramming.AsynchronousOperations Public Class AsyncDemo ' The method to be executed asynchronously. Public Function TestMethod(ByVal callDuration As Integer, _ <Out> ByRef threadId As Integer) As String Console.WriteLine("Test method begins.") Thread.Sleep(callDuration) threadId = Thread.CurrentThread.ManagedThreadId() return String.Format("My call time was {0}.", callDuration.ToString()) End Function End Class ' The delegate must have the same signature as the method ' it will call asynchronously. Public Delegate Function AsyncMethodCaller(ByVal callDuration As Integer, _ <Out> ByRef threadId As Integer) As String End Namespace
Imports System Imports System.Threading Imports System.Runtime.Remoting.Messaging Namespace Examples.AdvancedProgramming.AsynchronousOperations Public Class AsyncMain Shared Sub Main() ' Create an instance of the test class. Dim ad As New AsyncDemo() ' Create the delegate. Dim caller As New AsyncMethodCaller(AddressOf ad.TestMethod) ' The threadId parameter of TestMethod is an <Out> parameter, so ' its input value is never used by TestMethod. Therefore, a dummy ' variable can be passed to the BeginInvoke call. If the threadId ' parameter were a ByRef parameter, it would have to be a class- ' level field so that it could be passed to both BeginInvoke and ' EndInvoke. Dim dummy As Integer = 0 ' Initiate the asynchronous call, passing three seconds (3000 ms) ' for the callDuration parameter of TestMethod; a dummy variable ' for the <Out> parameter (threadId); the callback delegate; and ' state information that can be retrieved by the callback method. ' In this case, the state information is a string that can be used ' to format a console message. Dim result As IAsyncResult = caller.BeginInvoke(3000, _ dummy, _ AddressOf CallbackMethod, _ "The call executed on thread {0}, with return value ""{1}"".") Console.WriteLine("The main thread {0} continues to execute...", _ Thread.CurrentThread.ManagedThreadId) ' The callback is made on a ThreadPool thread. ThreadPool threads ' are background threads, which do not keep the application running ' if the main thread ends. Comment out the next line to demonstrate ' this. Thread.Sleep(4000) Console.WriteLine("The main thread ends.") End Sub ' The callback method must have the same signature as the ' AsyncCallback delegate. Shared Sub CallbackMethod(ByVal ar As IAsyncResult) ' Retrieve the delegate. Dim result As AsyncResult = CType(ar, AsyncResult) Dim caller As AsyncMethodCaller = CType(result.AsyncDelegate, AsyncMethodCaller) ' Retrieve the format string that was passed as state ' information. Dim formatString As String = CType(ar.AsyncState, String) ' Define a variable to receive the value of the <Out> parameter. ' If the parameter were ByRef rather than <Out> then it would have to ' be a class-level field so it could also be passed to BeginInvoke. Dim threadId As Integer = 0 ' Call EndInvoke to retrieve the results. Dim returnValue As String = caller.EndInvoke(threadId, ar) ' Use the format string to format the output message. Console.WriteLine(formatString, threadId, returnValue) End Sub End Class End Namespace ' This example produces output similar to the following: ' 'The main thread 1 continues to execute... 'Test method begins. 'The call executed on thread 3, with return value "My call time was 3000.". 'The main thread ends.
Available since 8
.NET Framework
Available since 1.1
Portable Class Library
Supported in: portable .NET platforms
Silverlight
Available since 2.0
Windows Phone Silverlight
Available since 7.0
Windows Phone
Available since 8.1