我正在使用WebClient将数据发布到Web服务,我想我会添加可用的进度事件,但我无法使其正常工作。我正在尝试上传200k到6Mb的文件,但是当事件被触发时,它会在几秒钟内被触发多次,并显示高达90%的百分比,即91,95,98等......但从不100%。
然后我等了一分半钟,它最终显示剩下的百分比一直到100。
这是我的函数(请注意,我删除了将对象转换为json或xml的代码)。
public static async Task<string> PostDataAsync<T>(string uriString, T data, WebHeaderCollection headers, ContentType contentType, string wrappedName)
{
using (WebClient client = new WebClient())
{
client.Encoding = System.Text.Encoding.UTF8;
client.Headers = headers;
client.Headers[HttpRequestHeader.Accept] = contentType == ContentType.Json ? "application/json" : "application/xml";
client.Headers[HttpRequestHeader.ContentType] = contentType == ContentType.Json ? "application/json" : "application/xml";
client.UploadDataCompleted += client_UploadDataCompleted;
client.UploadProgressChanged += client_UploadProgressChanged;
//Convert data to json/xml
byte[] requestBuffer = Encoding.UTF8.GetBytes(postData);
byte[] responseBuffer = await client.UploadDataTaskAsync(uriString, "POST", requestBuffer);
client.UploadDataCompleted -= client_UploadDataCompleted;
client.UploadProgressChanged -= client_UploadProgressChanged;
return System.Text.Encoding.UTF8.GetString(responseBuffer);
}
}
为什么会发生这种情况?可能是因为它是异步函数还是静态函数?
有没有办法在数据上升时显示百分比?
感谢。
更新
按要求添加了UploadProgressChanged事件:
static void client_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
{
Console.WriteLine(e.BytesSent.ToString() + " - " + e.TotalBytesToSend.ToString() + " - " + e.ProgressPercentage.ToString());
}
更新
以下是我保存到文件的一些数据。你可以清楚地看到2个错误的行为:
a)事件过早产生 b)事件生成太快 c)事件正确生成
时间:00:45:08.1141619 - BS:8192 - TBS:8625111 - BR:0 - TBR:-1 - %:0
时间:00:45:08.1141619 - BS:16384 - TBS:8625111 - BR:0 - TBR:-1 - %:0
时间:00:45:08.1171616 - BS:24576 - TBS:8625111 - BR:0 - TBR:-1 - %:0
时间:00:45:08.5374381 - BS:8282112 - TBS:8625111 - BR:0 - TBR:-1 - %:48
时间:00:45:08.5374381 - BS:8290304 - TBS:8625111 - BR:0 - TBR:-1 - %:48
时间:00:45:08.5284373 - BS:7577600 - TBS:8625111 - BR:0 - TBR:-1 - %:43
时间:00:45:08.5374381 - BS:8306688 - TBS:8625111 - BR:0 - TBR:-1 - %:48
时间:00:45:08.5374381 - BS:8331264 - TBS:8625111 - BR:0 - TBR:-1 - %:48
时间:00:45:08.5414384 - BS:8617984 - TBS:8625111 - BR:0 - TBR:-1 - %:49
时间:00:45:08.5414384 - BS:8625111 - TBS:8625111 - BR:0 - TBR:-1 - %:50
时间: 00:45:08.5404378 - BS:8536064 - TBS:8625111 - BR:0 - TBR:-1 - %:49
时间: 00:46:33.2813979 - BS:8625111 - TBS:8625111 - BR:545 - TBR:545 - %:100
PS:我的文件中有957个条目,所以我显然没有将它们全部粘贴,但其中956个是在1/2秒左右生成的。最后一行是在1分25秒后生成的。没有意义!!
答案 0 :(得分:1)
我看了%.html : %.md
echo pandoc -o $@ $<
%.pdf : %.md
echo pandoc -o $@ $<
.PHONY: $(MAKECMDGOALS)
$(MAKECMDGOALS): $(MAKECMDGOALS:%.md=%.html) $(MAKECMDGOALS:%.md=%.pdf)
的源代码,发现了这一点:
make a.md
这里是link。
看起来前50%基于发送的字节,后50%基于接收的字节。因此,如果您的Web服务立即以“确定”响应,那么您的进度将跳到100%。