WebClient和UploadProgressChanged更新太快

时间:2014-05-15 23:58:21

标签: c# .net webclient

我正在使用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个错误的行为:

  1. 0至49%,小于1/2秒
  2. 百分比下降然后回升(不太重要)
  3. 在1分25秒之后,它从49%跳到100%,两者之间没有产生任何事件,但它清楚地突出了一个问题:
  4. 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秒后生成的。没有意义!!

1 个答案:

答案 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%。