Pertanyaan Mengapa HttpWebRequest.BeginGetResponse () selesai serempak?


Saya sedang menguji ASP.NET (.NET 4) aplikasi web di bawah beban tinggi dan telah menemukan bahwa dalam beberapa kondisi HttpWebRequest.BeginGetResponse() selesai serempak tanpa membuang pengecualian apa pun.

Setelah menjalankan kode berikut di beberapa thread ASP.NET di bawah beban tinggi, saya telah menemukan "WEBREQUEST COMPLETED SYNC!" pesan dalam log.

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

Perhatikan bahwa:

  1. Jika kapasitas kolam renang ulir tercapai, InvalidOperationException dilemparkan
  2. Jika terjadi kesalahan saat koneksi pengecualian yang sesuai dilemparkan

Dalam kasus saya tidak ada pengecualian!

Saya telah mendekompilasi rakitan System.Net dan menemukan bahwa itu benar-benar mungkin dalam beberapa kondisi. Tapi saya tidak mengerti apa artinya kondisi ini (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);
  }
}

Kapan & mengapa ini mungkin?


5
2017-09-05 14:29


asal


Jawaban:


menemukan ini untuk CompletedSynchronously properti
Gunakan properti ini untuk menentukan apakah operasi asynchronous selesai secara sinkron. Sebagai contoh, properti ini dapat mengembalikan true untuk operasi I / O asynchronous jika permintaan I / O kecil.
SINI

EDIT: - Saya menduga bahwa respon mungkin akan di-cache. Oleh karena itu cobalah untuk menghentikan cache dari respon dengan menggunakan request.CachePolicy = new HttpRequestCachePolicy(/*caching type*/);


4
2017-09-05 14:40



Cara saya memahaminya adalah bahwa metode async selesai serentak dalam 3 skenario:

Operasi ini dapat diselesaikan dengan sangat cepat - dan dilakukan secara bersamaan untuk menghindari overhead pengelolaan operasi asynchronous.

Implementasi yang mendasarinya - atau sistem operasi - tidak mendukung Asynchronous Programming Model (APM) dalam skenario itu.

Operasi itu terikat pada CPU dan dapat diselesaikan tanpa pemblokiran.

(alasan diambil dari c # secara singkat J.Albahari & B.Albahari).


2
2017-09-05 14:36