IAsyncResult.AsyncWaitHandle Propriedade

Definição

Obtém um WaitHandle que é usado para aguardar a conclusão de uma operação assíncrona.

public System.Threading.WaitHandle AsyncWaitHandle { get; }

Valor da propriedade

WaitHandle

Um WaitHandle que é usado para aguardar a conclusão de uma operação assíncrona.

Exemplos

O exemplo a seguir demonstra como usar a AsyncWaitHandle propriedade para obter uma WaitHandlee como aguardar uma chamada assíncrona em um delegado. O WaitHandle é sinalizado quando a chamada assíncrona é concluída, e você pode esperar por ele chamando o método WaitOne.

O exemplo consiste em duas classes: a classe que contém o método que é chamado de forma assíncrona e a classe que contém o método Main que faz a chamada.

Para obter mais informações e mais exemplos de métodos de chamada de forma assíncrona usando delegados, consulte Chamando métodos síncronos de forma assíncrona.

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);
}
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.".
 */

Comentários

O valor retornado permite que o cliente aguarde a conclusão de uma operação assíncrona em vez de sondagem IsCompleted até que a operação seja concluída. O valor retornado pode ser usado para executar uma operação ou WaitAll uma WaitOneoperaçãoWaitAny.

O common language runtime fornece vários objetos que podem ser esperados, como ManualResetEvent, AutoResetEvente Mutex, todos os quais espelham primitivos de sincronização win32.

Notas aos Implementadores

O objeto que implementa IAsyncResult não precisa criar até WaitHandle que a AsyncWaitHandle propriedade seja lida. É a escolha do IAsyncResult implementador. No entanto, se o implementador for criado AsyncWaitHandle, será responsabilidade do implementador sinalizar o WaitHandle que encerrará a espera no momento apropriado. Por exemplo, AsyncResult encerra a espera em nome do chamador quando um método invocado de forma assíncrona retorna. Depois de criado, AsyncWaitHandle deve ser mantido vivo até que o usuário chame o método que conclui a operação assíncrona. Nesse momento, o objeto atrás AsyncWaitHandle pode ser descartado.

Notas aos Chamadores

Os clientes que aguardam a conclusão da operação (em vez de sondagem) usam essa propriedade para obter um objeto de sincronização para aguardar.

Observação: ao usar o BeginInvoke método de um delegado para chamar um método de forma assíncrona e obter um identificador de espera do resultado IAsyncResult, recomendamos que você feche o identificador de espera assim que terminar de usá-lo, chamando o Close() método. Se você simplesmente liberar todas as referências ao identificador de espera, os recursos do sistema serão liberados quando a coleta de lixo recuperar o identificador de espera, mas a coleta de lixo funcionar com mais eficiência quando objetos descartáveis forem explicitamente fechados ou descartados. Para obter mais informações, consulte a propriedade AsyncWaitHandle.

Aplica-se a

Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0