2009-09-03 8 views
15

he notado el siguiente patrón hace poco, pero no abarcar en su totalidad el uso de la propiedad completedSynchronously:AsyncCallback completedSynchronously

IAsyncResult channelOpenResult = channel.BeginOpen(new AsyncCallback(OnOpenCompleteChannel), channel); 
if (channelOpenResult.CompletedSynchronously) 
{ 
    CompleteOpenChannel(channelOpenResult); 
} 

Y, de nuevo, en la devolución de llamada:

void OnOpenCompleteChannel(IAsyncResult result) 
{ 
    if (result.CompletedSynchronously) 
     return; 
    else 
     CompleteOpenChannel(result); 
} 

Y en algún lugar del código existe, por supuesto, una función:

void CompleteOpenChannel(IAsyncResult result) ... 

¿Es esta una manera de handl ¿La llamada asincrónica es diferente dependiendo de si se completa directamente o no? Pero ¿por qué usarlo en este caso, ya que el AsyncCallback siempre se llamará (¿lo hará?)? ¿Podría alguien dar un ejemplo en el que la llamada se realiza de forma síncrona?

Respuesta

8

Ver this blog. Un patrón común funciona de manera asíncrona en un bucle, y al verificar CompletedSynchronously ayuda a evitar el caso en el que tiene "mala suerte" y un montón de llamadas asincrónicas completan la sincronización y se arriesga a StackOverflowException. (Por ejemplo, si está leyendo datos en la red y los datos que está leyendo ya se han transferido a través del cable y se almacenan en búfer, su llamada asíncrona puede completarse sincrónicamente, lo que significa que su devolución de llamada se llama en el mismo hilo (con un pila), lo que significa que es mejor no programar otra llamada asincrónica en un bucle).

0

De acuerdo con este document puede suministrar la llamada con una devolución de llamada síncrona y ASync, y solo si la llamada no se manejó de forma síncrona, ¿llamará a los métodos ASync. No creo que esto sea realmente aplicable a Silverlight (porque todas las llamadas de Silverlight son ASync hasta cierto punto) pero probablemente se use más para fábricas personalizadas en otras aplicaciones .NET.

Espero que esto ayude.

Cuestiones relacionadas