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 回答