2012-09-05 16 views
5

Estoy probando la aplicación web ASP.NET (.NET 4) bajo alta carga y he descubierto que bajo ciertas condiciones HttpWebRequest.BeginGetResponse() completa sincrónicamente sin lanzar ninguna excepción.¿Por qué HttpWebRequest.BeginGetResponse() se completa de forma síncrona?

Después de ejecutar el siguiente código en múltiples subprocesos de ASP.NET bajo alta carga, he encontrado "WEBREQUEST COMPLETED SYNC!" mensaje en los registros. atención

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); 
var result = webRequest.BeginGetResponse(internalCallback, userState); 
if (result.CompletedSynchronously) 
{ 
    Trace.Error("WEBREQUEST COMPLETED SYNC!"); 
} 

de pago que:

  1. En caso de que la capacidad del grupo de subprocesos se llega a un InvalidOperationException se lanza
  2. En caso de error se produce durante la conexión correspondiente excepción se lanza

En mi caso no hay excepciones!

He decompilado el ensamblado de System.Net y he descubierto que es realmente posible bajo ciertas condiciones. Pero yo no entendía lo que significan estas condiciones (System.Net.Connection.SubmitRequest(HttpWebRequest request, bool forcedsubmit)):

if (this.m_Free && this.m_WriteDone && !forcedsubmit && (this.m_WriteList.Count == 0 || request.Pipelined && !request.HasEntityBody && (this.m_CanPipeline && this.m_Pipelining) && !this.m_IsPipelinePaused)) 
{ 
    this.m_Free = false; 
    needReConnect = this.StartRequest(request, true); 
    if (needReConnect == TriState.Unspecified) 
    { 
    flag = true; 
    this.PrepareCloseConnectionSocket(ref returnResult); 
    this.Close(0); 
    } 
} 

Cuando & qué es esto posible?

+0

observe que [AysncCallBack CompletedSynchronously] (http://stackoverflow.com/questions/1372053/asynccallback-completedsynchronously) le dirá qué parte común del ciclo asincrónico se completa de forma sincronizada cuando tu devolución de llamada está en el mismo hilo. – Turbot

Respuesta

4

encontraron esta CompletedSynchronously para propperty
Utilice esta propiedad para determinar si la operación asincrónica ha completado de forma sincrónica. Por ejemplo, esta propiedad puede devolver verdadero para una operación de E/S asíncrona si la solicitud de E/S fue pequeña.
HERE

EDIT: - Sospecho que la respuesta podría estar recibiendo en caché. por lo tanto, intente detener el almacenamiento en caché de la respuesta utilizando request.CachePolicy = new HttpRequestCachePolicy(/*caching type*/);

+0

¿por qué votar abajo? –

+0

Útil, pero no una respuesta +1 –

+0

@exacerbatedexpert +1 Pero espero una referencia al código descompilado o al artículo con detalles cuando sea posible. "Pequeño" no es un criterio. –

2

La manera en que yo entiendo es que los métodos asincrónicos completos de forma sincrónica en 3 escenarios:

la operación podría completarse muy rápidamente - y así fue ejecutado de forma sincronizada para evitar la sobrecarga de la gestión de una operación asíncrona.

La implementación subyacente (o sistema operativo) no es compatible con el Modelo de programación asíncrono (APM) en ese escenario.

La operación estaba vinculada a la CPU y podría completarse sin bloqueo.

(razones tomadas de C# en pocas palabras J.Albahari & B.Albahari).

+0

Gracias. Pero necesito más detalles, especialmente para HttpWebRequst o enlaces al código. –

Cuestiones relacionadas