0

次のようなアップロード リクエストの状態を追跡したいと考えています。

  • アップロードパケット
  • 進行状況に合わせて 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% のままになります。

4

1 に答える 1

0

まず、あなたの PACKETSIZE の定義が見つかりません。デバッグしてbytes、パケット サイズ定数よりも長いことを確認しましたか?

第二に、そのループを正しく使用しているとは思えません。をアップロードしているとき、あなたGetRequestStreamは最後に更新され、途中でフラッシュしようとするのは正しくないようです。(詳細については、この回答をご覧ください)。

これを試してください: 配列を 10 個に分割します。0 ~ 9 のループを実行し、それぞれに対応する配列ビットを送信し、応答を待ち、ストリームをフラッシュ/クローズしてから、UI.SetProgress. すすいで繰り返します。

于 2013-11-06T00:37:10.667 に答える