2009-11-29 19 views

Respuesta

21
  1. WaitHandle.WaitOne() es un método de instancia que se bloqueará hasta que se indique el identificador de espera (cuando se complete la operación). Si ya se ha señalado previamente (es decir, la operación ya se ha completado), es posible que la llamada al WaitOne() no se bloquee.
  2. WaitHandle.WaitAll() y WaitHandle.WaitAny() son métodos estáticos que permiten especificar un número de espera se encarga de supervisar simultáneamente:

    • WaitHandle.WaitAll() esperará hasta que todos de las asas especificados se han señalado antes de que vuelva.
    • WaitHandle.WaitAny() volverá tan pronto como de los identificadores especificados se hayan señalizado.

    Estos métodos le permiten controlar varias operaciones asincrónicas sobresalientes al mismo tiempo.

Antecedentes:AsyncWaitHandle es el nombre de una propiedad en la interfaz IAsyncResult. El tipo real de esta propiedad es WaitHandle, que es una clase base abstracta para tipos como Semaphore, Mutex y Manual/AutoResetEvent.

Ver también:Blocking Application Execution Using an AsyncWaitHandle (MSDN)

+0

Antes de EndInvoke() ¿necesitamos llamarlos? – user215675

+0

Tiene razón, pero creo que el OP estaba preguntando específicamente sobre AsyncWaitHandle.WaitOne(). Así que creo que estaba preguntando si la llamada a WaitOne siempre bloquearía incluso si la operación de sincronización se hubiera completado, lo que por supuesto no sería – zebrabox

+0

. No se puede llamar a EndInvoke() en cualquier momento después de BeginInvoke() y bloqueará si la operación no ha terminado todavía –

2

Los métodos le permiten esperar en un evento de Windows. WaitOne no es estático y espera en el identificador de evento para ese objeto. WaitAll y WaitAny son métodos estáticos de toda la clase que esperan un grupo de controladores de eventos. WaitAll espera a que todos los eventos señalen y WaitAny a un solo evento en el grupo.

+0

No está seguro de lo que entendemos por 'esperar en los eventos de Windows'. WaitOne se usa principalmente para sincronizar operaciones asincrónicas, es decir, una sincronización de subprocesos con otra secuencia. El OP preguntaba por AsyncWaitHandle.WaitOne. AsyncWaitHandle es un WaitHandle normalmente utilizado para sincronizar un BeginInvoke, es decir, elimina la necesidad de sondear y llama a IsCompleted en IAsyncResult – zebrabox

+0

. También se puede usar para eventos de Windows (p. Ej. CreateEvent), vea la propiedad SafeWaitHandle y http://msdn.microsoft.com /en-us/library/microsoft.win32.safehandles.safewaithandle.safewaithandle.aspx. – kenny