我正在測試高負載下的ASP.NET(.NET 4)web應用程序,並發現在某些情況下HttpWebRequest.BeginGetResponse()
會在不拋出任何異常的情況下同步完成。爲什麼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 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);
}
}
當&爲什麼這可能嗎?
看看[AysncCallBack Completed Synchronousously](http://stackoverflow.com/questions/1372053/asynccallback-completedsynchronously)會告訴你什麼是異步循環的共同partter完成同步時你的回調是在同一個線程中。 – Turbot