2011-06-30 17 views
6

duplicados posibles:
Must every BeginInvoke be followed by an EndInvoke?
Is EndInvoke() optional, sort-of optional, or definitely not optional?Invocación asincrónica: ¿se requiere EndInvoke?

Tengo una aplicación multiproceso, y uno de los hilos secundarios tiene que conseguir un poco de código a ejecutar en el hilo principal una vez cada un par de minutos. No hay ningún valor devuelto, y al segundo subproceso no le importa si genera alguna excepción o no se ejecuta.

Hasta ahora, he estado obteniendo que ejecute el código a través de Form.Invoke, pero a veces lleva mucho más tiempo de lo habitual (un par de segundos) y bloquea el hilo hasta que se completa. Necesito el segundo hilo para poder continuar la ejecución sin estancar durante varios segundos.

BeginInvoke suena como que haría el trabajo muy bien, pero realmente no tengo ningún lugar para llamar al EndInvoke, ya que no quiero esperar o obtener un valor de retorno. Y teniendo en cuenta que el código invocado implica un montón de llamadas nativas, no estoy seguro de si es una buena idea no EndInvoke.

¿Tengo que llamar al EndInvoke, o hay alguna otra forma de que el código se ejecute en el hilo principal de forma asíncronamente que debería estar utilizando en su lugar?

Gracias =)

Respuesta

6

Puede llamar EndInvoke para recuperar el valor de retorno del delegado, si NECESARIO, pero esto no es necesario. EndInvoke se bloqueará hasta que se pueda recuperar el valor de retorno.

Fuente: http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx bajo Observaciones

+0

Impresionante, así que puedo cambiar mi 'Invoke's' a BeginInvoke's sin explotar nada. –

3

Debe asegurarse de que EndInvoke se llama, pero se puede hacer muy fácilmente, algo así como:

var action = new Action(SomeMethodGroup); 

    action.BeginInvoke(new AsyncCallback(

     x => (x.AsyncState as Action).EndInvoke(x)), action); 
+0

creo que el PO está hablando de Form.BeginInvoke en particular, y no el Comenzar/EndInvoke patrón en general. Al mirar MSDN, Form.BeginInvoke no parece seguir exactamente el patrón Begin/EndInvoke. – dtb

+0

@dtb, De hecho, no creo que sea estrictamente necesario para Form.BeginInvoke o Delegate.BeginInvoke, ya que creo que solo crea un WaitHandle si intentas esperar (es decir, llamar a EndInvoke). WaitHandle debe limpiarse arriba, pero lo será si ha llamado a EndInvoke. –

+0

Un buen punto, tal vez no necesite EndInvoke, tal vez un método simple que podría funcionar como una estrategia de "fuego y olvídate". –

4

Una forma típica de llamar EndInvoke es mediante la inclusión de una devolución de llamada terminación con BeginInvoke para que pueda llamar a EndInvoke en la devolución de llamada. Esto es más importante para los métodos Begin/End que hacen algo más específico que Invoke, como BeginRead/EndRead; en los últimos casos, el End puede ser requerido para la limpieza y típicamente (re) arrojará cualquier Excepción que ocurra durante el proceso.

Cuestiones relacionadas