AsyncResult Clase

Definición

Encapsula los resultados de una operación asincrónica en un delegado.

public ref class AsyncResult : IAsyncResult, System::Runtime::Remoting::Messaging::IMessageSink
public class AsyncResult : IAsyncResult, System.Runtime.Remoting.Messaging.IMessageSink
[System.Runtime.InteropServices.ComVisible(true)]
public class AsyncResult : IAsyncResult, System.Runtime.Remoting.Messaging.IMessageSink
type AsyncResult = class
    interface IAsyncResult
    interface IMessageSink
[<System.Runtime.InteropServices.ComVisible(true)>]
type AsyncResult = class
    interface IAsyncResult
    interface IMessageSink
Public Class AsyncResult
Implements IAsyncResult, IMessageSink
Herencia
AsyncResult
Atributos
Implementaciones

Ejemplos

En el ejemplo siguiente se muestra cómo usar la AsyncWaitHandle propiedad para obtener un WaitHandley cómo esperar una llamada asincrónica en un delegado. WaitHandle se señaliza cuando finaliza la llamada asincrónica y puede esperar a que termine llamando al método WaitOne .

El ejemplo consta de dos clases, la clase que contiene el método al que se llama de forma asincrónica y la clase que contiene el Main método que realiza la llamada.

Para obtener más información y más ejemplos de métodos de llamada de forma asincrónica mediante delegados, vea Llamar a métodos sincrónicos de forma asincrónica.

using namespace System;
using namespace System::Threading;
using namespace System::Runtime::InteropServices; 

namespace Examples {
namespace AdvancedProgramming {
namespace AsynchronousOperations
{
    public ref class AsyncDemo 
    {
    public:
        // The method to be executed asynchronously.
        String^ TestMethod(int callDuration, [OutAttribute] int% threadId) 
        {
            Console::WriteLine("Test method begins.");
            Thread::Sleep(callDuration);
            threadId = Thread::CurrentThread->ManagedThreadId;
            return String::Format("My call time was {0}.", callDuration);
        }
    };

    // The delegate must have the same signature as the method
    // it will call asynchronously.
    public delegate String^ AsyncMethodCaller(int callDuration, [OutAttribute] int% threadId);
}}}
using System;
using System.Threading;

namespace Examples.AdvancedProgramming.AsynchronousOperations
{
    public class AsyncDemo
    {
        // The method to be executed asynchronously.
        public string TestMethod(int callDuration, out int threadId)
        {
            Console.WriteLine("Test method begins.");
            Thread.Sleep(callDuration);
            threadId = Thread.CurrentThread.ManagedThreadId;
            return String.Format("My call time was {0}.", callDuration.ToString());
        }
    }
    // The delegate must have the same signature as the method
    // it will call asynchronously.
    public delegate string AsyncMethodCaller(int callDuration, out int threadId);
}
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
#using <TestMethod.dll>

using namespace System;
using namespace System::Threading;
using namespace Examples::AdvancedProgramming::AsynchronousOperations;

void main() 
{
    // The asynchronous method puts the thread id here.
    int threadId;

    // Create an instance of the test class.
    AsyncDemo^ ad = gcnew AsyncDemo();

    // Create the delegate.
    AsyncMethodCaller^ caller = gcnew AsyncMethodCaller(ad, &AsyncDemo::TestMethod);
       
    // Initiate the asychronous call.
    IAsyncResult^ result = caller->BeginInvoke(3000, 
        threadId, nullptr, nullptr);

    Thread::Sleep(0);
    Console::WriteLine("Main thread {0} does some work.",
        Thread::CurrentThread->ManagedThreadId);

    // Wait for the WaitHandle to become signaled.
    result->AsyncWaitHandle->WaitOne();

    // Perform additional processing here.
    // Call EndInvoke to retrieve the results.
    String^ returnValue = caller->EndInvoke(threadId, result);

    // Close the wait handle.
    result->AsyncWaitHandle->Close();

    Console::WriteLine("The call executed on thread {0}, with return value \"{1}\".",
        threadId, returnValue);
}

/* This example produces output similar to the following:

Main thread 1 does some work.
Test method begins.
The call executed on thread 3, with return value "My call time was 3000.".
 */
using System;
using System.Threading;

namespace Examples.AdvancedProgramming.AsynchronousOperations
{
    public class AsyncMain
    {
        static void Main()
        {
            // The asynchronous method puts the thread id here.
            int threadId;

            // Create an instance of the test class.
            AsyncDemo ad = new AsyncDemo();

            // Create the delegate.
            AsyncMethodCaller caller = new AsyncMethodCaller(ad.TestMethod);

            // Initiate the asychronous call.
            IAsyncResult result = caller.BeginInvoke(3000,
                out threadId, null, null);

            Thread.Sleep(0);
            Console.WriteLine("Main thread {0} does some work.",
                Thread.CurrentThread.ManagedThreadId);

            // Wait for the WaitHandle to become signaled.
            result.AsyncWaitHandle.WaitOne();

            // Perform additional processing here.
            // Call EndInvoke to retrieve the results.
            string returnValue = caller.EndInvoke(out threadId, result);

            // Close the wait handle.
            result.AsyncWaitHandle.Close();

            Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".",
                threadId, returnValue);
        }
    }
}

/* This example produces output similar to the following:

Main thread 1 does some work.
Test method begins.
The call executed on thread 3, with return value "My call time was 3000.".
 */
Imports System.Threading
Imports System.Runtime.InteropServices 

Namespace Examples.AdvancedProgramming.AsynchronousOperations

    Public Class AsyncMain 
        Shared Sub Main() 
            ' The asynchronous method puts the thread id here.
            Dim threadId As Integer

            ' Create an instance of the test class.
            Dim ad As New AsyncDemo()

            ' Create the delegate.
            Dim caller As New AsyncMethodCaller(AddressOf ad.TestMethod)
       
            ' Initiate the asynchronous call.
            Dim result As IAsyncResult = caller.BeginInvoke(3000, _
                threadId, Nothing, Nothing)

            Thread.Sleep(0)
            Console.WriteLine("Main thread {0} does some work.", _
                Thread.CurrentThread.ManagedThreadId)
            ' Perform additional processing here and then
            ' wait for the WaitHandle to be signaled.
            result.AsyncWaitHandle.WaitOne()

            ' Call EndInvoke to retrieve the results.
            Dim returnValue As String = caller.EndInvoke(threadId, result)

            ' Close the wait handle.
            result.AsyncWaitHandle.Close()

            Console.WriteLine("The call executed on thread {0}, with return value ""{1}"".", _
                threadId, returnValue)
        End Sub
    End Class
End Namespace

'This example produces output similar to the following:
'
'Main thread 1 does some work.
'Test method begins.
'The call executed on thread 3, with return value "My call time was 3000.".

Comentarios

La AsyncResult clase se usa junto con las llamadas de método asincrónicas realizadas mediante delegados. El IAsyncResult devuelto desde el método del BeginInvoke delegado se puede convertir en .AsyncResult AsyncResult tiene la AsyncDelegate propiedad que contiene el objeto delegado en el que se invocó la llamada asincrónica.

Para obtener más información sobre BeginInvoke las llamadas asincrónicas y mediante delegados, vea Programación asincrónica mediante delegados.

Propiedades

AsyncDelegate

Obtiene el objeto delegado en el que se ha invocado la llamada asincrónica.

AsyncState

Obtiene el objeto proporcionado como el último parámetro de una llamada al método BeginInvoke.

AsyncWaitHandle

Obtiene un WaitHandle que encapsula identificadores de sincronización Win32, y permite la implementación de varios esquemas de sincronización.

CompletedSynchronously

Obtiene un valor que indica si la llamada de BeginInvoke ha finalizado de forma sincrónica.

EndInvokeCalled

Obtiene o establece un valor que indica si se ha llamado a EndInvoke en el AsyncResult actual.

IsCompleted

Obtiene un valor que indica si el servidor ha completado la llamada.

NextSink

Obtiene el siguiente receptor de mensajes en la cadena de receptores.

Métodos

AsyncProcessMessage(IMessage, IMessageSink)

Implementa la interfaz IMessageSink.

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetReplyMessage()

Obtiene el mensaje de respuesta para la llamada asincrónica.

GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
SetMessageCtrl(IMessageCtrl)

Establece IMessageCtrl para la llamada a método remoto actual, que proporciona una manera de controlar los mensajes asincrónicos una vez enviados.

SyncProcessMessage(IMessage)

Procesa sincrónicamente un mensaje de respuesta devuelto por una llamada a método en un objeto remoto.

ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Se aplica a

Consulte también