C# 为什么HttpWebRequest.BeginGetResponse()会同步完成?
我正在高负载下测试ASP.NET(.NET 4)web应用程序,发现在某些情况下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
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!");
}
请注意:
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);
}
}