我想跟踪上传请求的状态,例如:
所以我尝试了下面的代码(从网上找到的例子中收集)。
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%。
答案 0 :(得分:0)
首先,我找不到你的PACKETSIZE的定义。您是否进行了调试并确保bytes
长于数据包大小常量?
其次,我怀疑你是否正确使用了这个循环。
当您上传时,您的GetRequestStream
会在最后更新,并尝试在中途刷新它似乎不正确。 (有关详细信息,请查看this答案)。
试试这个:将阵列分成10块。从0-9运行一个循环,并在每个循环中发送相应的数组位,等待响应,刷新/关闭流,然后调用UI.SetProgress
。冲洗并重复。