次のようなアップロード リクエストの状態を追跡したいと考えています。
- アップロードパケット
- 進行状況に合わせて UI を更新する
- アップロードパケット
- 進行状況に合わせて UI を更新する
- アップロードパケット
- 進行状況に合わせて UI を更新する
- などなど
そこで、次のコードを試しました (オンラインで見つかった例から収集)。
void SendData()
{
byte[] bytes = Encoding.UTF8.GetBytes(GetContent());
HttpWebRequest webRequest = WebRequest.Create(GetURL()) as HttpWebRequest;
webRequest.Method = "PUT";
webRequest.ContentType = @"application/x-www-form-urlencoded";
webRequest.ContentLength = bytes.Length;
// this doesn't seem to help
webRequest.AllowWriteStreamBuffering = false;
using (Stream reqStream = webRequest.GetRequestStream())
{
int bytesUploaded = 0;
while (bytesUploaded != bytes.Length)
{
int packetSize = Math.Min(PACKETSIZE, bytes.Length - bytesUploaded);
reqStream.Write(bytes /*buffer*/,
bytesUploaded /*Offset*/,
packetSize /*Count*/);
// this doesn't seem to help
reqStream.Flush();
bytesUploaded += packetSize;
UI.SetProgress(bytesUploaded / bytes.Length,
true /*Dispatch?*/);
}
}
WebResponse webResponse = webRequest.GetResponse(); //stalls here while it uploads
}
しかし、期待どおりに機能していません。フラッシュ後にバイトをアップロードするのではなく、while ループを複数回繰り返して実行し、GetResponse() ステージでアップロードします。while ループ内でアップロードされないことはわかっています。これは、バイト配列をどれだけ大きく設定しても、ループを通過するのにかかる時間はほとんど変わらないためです。しかし、GetResponse() ステージの時間は比例して増加します。
その結果、進行状況は瞬く間に 0 ~ 100% になり、実際にデータを送信するのにかかる時間は 100% のままになります。