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:
- En caso de que la capacidad del grupo de subprocesos se llega a un InvalidOperationException se lanza
- 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?
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