高負荷で 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 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);
}
}
いつ、なぜこれが可能ですか?