Export (0) Print
Expand All

AsyncResult Class

Encapsulates the results of an asynchronous operation on an asynchronous delegate.

For a list of all members of this type, see AsyncResult Members.

System.Object
   System.Runtime.Remoting.Messaging.AsyncResult

[Visual Basic]
Public Class AsyncResult
   Implements IAsyncResult, IMessageSink
[C#]
public class AsyncResult : IAsyncResult, IMessageSink
[C++]
public __gc class AsyncResult : public IAsyncResult, IMessageSink
[JScript]
public class AsyncResult implements IAsyncResult, IMessageSink

Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Remarks

The AsyncResult class is used in conjunction with asynchronous delegates. The IAsyncResult returned from the delegate's BeginInvoke method can be cast to an AsyncResult. The AsyncResult has the AsyncDelegate property that holds the delegate object on which the async call was invoked.

For more information about BeginInvoke and asynchronous delegates, see Asynchronous Delegates.

Example

[Visual Basic, C#, C++] The following code example demonstrates the use of the AsyncResult class to retrieve the results of an asynchronous operation on an asynchronous delegate.

[Visual Basic] 
Imports System
Imports System.Threading
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Contexts
Imports System.Runtime.Remoting.Messaging


' Context-bound type with the Synchronization context attribute.
<Synchronization()> Public Class SampleSyncronized
   Inherits ContextBoundObject
   
   ' A method that does some work, and returns the square of the given number.
   Public Function Square(i As Integer) As Integer
      
      Console.Write("The hash of the thread executing ")
      Console.WriteLine("SampleSyncronized.Square is: {0}", Thread.CurrentThread.GetHashCode())
      Return i * i
   End Function 'Square

End Class 'SampleSyncronized

' The async delegate used to call a method with this signature asynchronously.
Delegate Function SampSyncSqrDelegate(i As Integer) As Integer


Public Class AsyncResultSample
   
   ' Asynchronous Callback method.
   Public Shared Sub MyCallback(ar As IAsyncResult)
      ' Obtains the last parameter of the delegate call.
      Dim value As Integer = Convert.ToInt32(ar.AsyncState)
      
      ' Obtains return value from the delegate call using EndInvoke.
      Dim aResult As AsyncResult = CType(ar, AsyncResult)
      Dim temp As SampSyncSqrDelegate = CType(aResult.AsyncDelegate, SampSyncSqrDelegate)
      Dim result As Integer = temp.EndInvoke(ar)
      
      Console.Write("Simple.SomeMethod (AsyncCallback): Result of ")
      Console.WriteLine("{0} in SampleSynchronized.Square is {1} ", value, result)
   End Sub 'MyCallback  

   Public Shared Sub Main()
      
      Dim result As Integer
      Dim param As Integer
      
      ' Creates an instance of a context-bound type SampleSynchronized.
      Dim sampSyncObj As New SampleSyncronized()
      
      ' Checks whether the object is a proxy, since it is context-bound.
      If RemotingServices.IsTransparentProxy(sampSyncObj) Then
         Console.WriteLine("sampSyncObj is a proxy.")
      Else
         Console.WriteLine("sampSyncObj is NOT a proxy.")
      End If 

      param = 10
      
      Console.WriteLine("")
      Console.WriteLine("Making a synchronous call on the context-bound object:")
      
      result = sampSyncObj.Square(param)
      Console.Write("The result of calling sampSyncObj.Square with ")
      Console.WriteLine("{0} is {1}.", param, result)
      Console.WriteLine("")     

      Dim sampleDelegate As New SampSyncSqrDelegate(AddressOf sampSyncObj.Square)
      param = 8
      
      Console.WriteLine("Making a single asynchronous call on the context-bound object:")
      
      Dim ar1 As IAsyncResult = sampleDelegate.BeginInvoke(param, New AsyncCallback(AddressOf AsyncResultSample.MyCallback), param)
      
      Console.WriteLine("Waiting for the asynchronous call to complete...")
      Dim wh As WaitHandle = ar1.AsyncWaitHandle
      wh.WaitOne()
      
      Console.WriteLine("")
      Console.WriteLine("Waiting for the AsyncCallback to complete...")
      Thread.Sleep(1000)
   End Sub 'Main 
End Class 'AsyncResultSample 

[C#] 
using System;
using System.Threading;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Contexts;
using System.Runtime.Remoting.Messaging;

// Context-bound type with the Synchronization context attribute.
[Synchronization()]
public class SampleSyncronized : ContextBoundObject {

    // A method that does some work, and returns the square of the given number.
    public int Square(int i)  {

        Console.Write("The hash of the thread executing ");
        Console.WriteLine("SampleSyncronized.Square is: {0}", 
                             Thread.CurrentThread.GetHashCode());
        return i*i;
    }
}

// The async delegate used to call a method with this signature asynchronously.
public delegate int SampSyncSqrDelegate(int i);

public class AsyncResultSample {

    // Asynchronous Callback method.
    public static void MyCallback(IAsyncResult ar) {

        // Obtains the last parameter of the delegate call.
        int value = Convert.ToInt32(ar.AsyncState);

        // Obtains return value from the delegate call using EndInvoke.
        AsyncResult aResult = (AsyncResult)ar;
        SampSyncSqrDelegate temp = (SampSyncSqrDelegate)aResult.AsyncDelegate;
        int result = temp.EndInvoke(ar);

        Console.Write("Simple.SomeMethod (AsyncCallback): Result of ");
        Console.WriteLine("{0} in SampleSynchronized.Square is {1} ", value, result);
    }

    public static void Main() {

        int result;
        int param;

        // Creates an instance of a context-bound type SampleSynchronized.
        SampleSyncronized sampSyncObj = new SampleSyncronized();

        // Checks whether the object is a proxy, since it is context-bound.
        if (RemotingServices.IsTransparentProxy(sampSyncObj))
            Console.WriteLine("sampSyncObj is a proxy.");
        else
            Console.WriteLine("sampSyncObj is NOT a proxy.");

        param = 10;

        Console.WriteLine("");
        Console.WriteLine("Making a synchronous call on the context-bound object:");

        result = sampSyncObj.Square(param);
        Console.Write("The result of calling sampSyncObj.Square with ");
        Console.WriteLine("{0} is {1}.", param, result);
        Console.WriteLine("");

        SampSyncSqrDelegate sampleDelegate = new SampSyncSqrDelegate(sampSyncObj.Square);
        param = 8;

        Console.WriteLine("Making a single asynchronous call on the context-bound object:");

        IAsyncResult ar1 = sampleDelegate.BeginInvoke( param, 
                              new AsyncCallback(AsyncResultSample.MyCallback), 
                              param);

        Console.WriteLine("Waiting for the asynchronous call to complete...");
        WaitHandle wh = ar1.AsyncWaitHandle;
        wh.WaitOne();

        Console.WriteLine("");
        Console.WriteLine("Waiting for the AsyncCallback to complete...");
        Thread.Sleep(1000);
    }
}

[C++] 
#using <mscorlib.dll>

using namespace System;
using namespace System::Threading;
using namespace System::Runtime::Remoting;
using namespace System::Runtime::Remoting::Contexts;
using namespace System::Runtime::Remoting::Messaging;

// Context-bound type with the Synchronization context attribute.
[Synchronization]
public __gc class SampleSyncronized : public ContextBoundObject 
{
    // A method that does some work, and returns the square of the given number.
public:
    int Square(int i) 
    {
        Console::Write(S"The hash of the thread executing ");
        Console::WriteLine(S"SampleSyncronized::Square is: {0}",
                    __box(Thread::CurrentThread->GetHashCode()));
        return i*i;
    }
};

// The async delegate used to call a method with this signature asynchronously.
public __delegate int SampSyncSqrDelegate(int i);

public __gc class AsyncResultSample 
{
    // Asynchronous Callback method.
public:
    static void MyCallback(IAsyncResult* ar) 
    {
        // Obtains the last parameter of the delegate call.
        int value = Convert::ToInt32(ar->AsyncState);

        // Obtains return value from the delegate call using EndInvoke.
        AsyncResult* aResult = dynamic_cast<AsyncResult*>(ar);
        SampSyncSqrDelegate* temp = static_cast<SampSyncSqrDelegate*>(aResult->AsyncDelegate);
        int result = temp->EndInvoke(ar);

        Console::Write(S"Simple::SomeMethod (AsyncCallback): Result of ");
        Console::WriteLine(S" {0} in SampleSynchronized::Square is {1} ", __box(value), __box(result));
    }
};

int main()
{
    int result;
    int param;

    // Creates an instance of a context-bound type SampleSynchronized.
    SampleSyncronized* sampSyncObj = new SampleSyncronized();

    // Checks whether the Object* is a proxy, since it is context-bound.
    if (RemotingServices::IsTransparentProxy(sampSyncObj))
        Console::WriteLine(S"sampSyncObj is a proxy.");
    else
        Console::WriteLine(S"sampSyncObj is NOT a proxy.");

    param = 10;

    Console::WriteLine(S"");
    Console::WriteLine(S"Making a synchronous call on the context-bound Object*:");

    result = sampSyncObj->Square(param);
    Console::Write(S"The result of calling sampSyncObj.Square with ");
    Console::WriteLine(S" {0} is {1}.", __box(param), __box(result));
    Console::WriteLine(S"");

    SampSyncSqrDelegate* sampleDelegate = new SampSyncSqrDelegate(sampSyncObj, SampleSyncronized::Square);
    param = 8;

    Console::WriteLine(S"Making a single asynchronous call on the context-bound Object*:");

    IAsyncResult* ar1 = sampleDelegate->BeginInvoke(param, 
        new AsyncCallback(0, AsyncResultSample::MyCallback), 
        __box(param));

    Console::WriteLine(S"Waiting for the asynchronous call to complete...");
    WaitHandle* wh = ar1->AsyncWaitHandle;
    wh->WaitOne();

    Console::WriteLine(S"");
    Console::WriteLine(S"Waiting for the AsyncCallback to complete...");
    Thread::Sleep(1000);

    return 0;
}

[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button Language Filter in the upper-left corner of the page.

Requirements

Namespace: System.Runtime.Remoting.Messaging

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

Assembly: Mscorlib (in Mscorlib.dll)

See Also

AsyncResult Members | System.Runtime.Remoting.Messaging Namespace | Asynchronous Delegates

Show:
© 2014 Microsoft