C# 为什么HttpWebRequest.BeginGetResponse()会同步完成?

C# 为什么HttpWebRequest.BeginGetResponse()会同步完成?,c#,asp.net,.net,performance,c#-4.0,C#,Asp.net,.net,Performance,C# 4.0,我正在高负载下测试ASP.NET(.NET 4)web应用程序,发现在某些情况下HttpWebRequest.BeginGetResponse()会同步完成,而不会引发任何异常 在高负载下在多个ASP.NET线程中运行以下代码后,我在日志中发现了“WEBREQUEST COMPLETED SYNC!”消息 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); var result = webRequest.Begi

我正在高负载下测试ASP.NET(.NET 4)web应用程序,发现在某些情况下
HttpWebRequest.BeginGetResponse()
会同步完成,而不会引发任何异常

在高负载下在多个ASP.NET线程中运行以下代码后,我在日志中发现了“WEBREQUEST COMPLETED SYNC!”消息

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

  • 如果达到线程池容量,将引发InvalidOperationException
  • 若在连接过程中发生错误,则会引发相应的异常
  • 就我而言,没有例外

    我已经对System.Net程序集进行了反编译,发现在某些条件下它确实是可能的。但我不理解这些条件的含义(
    System.Net.Connection.SubmitRequest(HttpWebRequest,bool forcedsubmit)
    ):


    什么时候&为什么可能?

    我的理解是异步方法在3种情况下同步完成:

    该操作可以很快完成,因此是同步执行的,以避免管理异步操作的开销

    在该场景中,底层实现(或操作系统)不支持异步编程模型(APM)

    该操作受CPU限制,可以在不阻塞的情况下完成


    (原因来自c#简言之,J.Albahari和B.Albahari)。

    发现这是因为
    同步完成了
    属性
    使用此属性确定异步操作是否同步完成。例如,如果I/O请求很小,则异步I/O操作的此属性可以返回true。


    EDIT:-我怀疑可能正在缓存响应。因此,尝试使用
    request.CachePolicy=new-HttpRequestCachePolicy(/*缓存类型*/)停止响应缓存

    谢谢。但我需要更多的细节,特别是关于HttpWebRequst或代码链接。有用,但不是答案+1@exacerbatedexpert+1但我希望在可能的情况下引用反编译代码或包含详细信息的文章。“小”不是条件。@ParvSharma服务器返回缓存控制:无缓存头。所以,缓存将不起作用。当回调在同一线程中时,它将告诉您异步循环的哪个公共部分是同步完成的。
    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);
      }
    }