【问题标题】:WebClient AsyncUpload progress percentage always returns 50%WebClient AsyncUpload 进度百分比始终返回 50%
【发布时间】:2010-01-26 15:01:36
【问题描述】:

我正在使用 Webclient 通过异步调用将数据上传到服务器,

    WebClient webClient = new WebClient();
   webClient.UploadDataAsync(uri , "PUT", buffer, userToken);

我已将 DatauploadProgress 和 DatauploadCompleted 事件附加到适当的回调函数

        // Upload Date Progress
        webClient.UploadProgressChanged += new 
        UploadProgressChangedEventHandler(UploadProgressCallback);

      // Upload Date Progress
     void UploadProgressCallback(object sender, UploadProgressChangedEventArgs e)
    {
        // Magic goes here 
     logger.writeToLog("Percentage =" + e.ProgressPercentage);
    }

e.ProgressPercentage 总是返回 50 .. 无论上传文件的大小是多少(尝试了 10kb 到 60mb 之间的不同大小)。 函数本身只被调用两次(也非常快),百分比显示为 50! ..这对于大文件来说特别不合逻辑...

e.BytesSent 也无济于事..它总是以字节为单位显示文件大小:S(例如:如果文件大小为 63,000,我会得到e.BytesSent = 63,000e.ProgressPercentage= 50

谁能给我指出问题?

【问题讨论】:

标签: c# .net webclient progress uploaddataasync


【解决方案1】:

如果您想监控上传进度,您需要使用 UploadFileAsync 而不是 UploadData。

使用 UploadDataAsync,您应该手动分块文件并显示进度(至少,这是我根据自己的经验确定的,尽管我没有在 MSDN 上看到它是这样写的)。

您正在寻找的是改用 UploadFileAsync,它将正确调用 UploadProgressChanged 事件。然后您可以查看应该正确反映的事件 args 属性 BytesSent 和 TotalBytesToSend。

我认为这背后的基本原理是,当您发送数据时,您可以遍历数据流的块并手动增加进度跟踪器,而使用文件则不能(.NET 将管理 整个 为您上传)。就我个人而言,我觉得有些可疑,因为在 UploadDataAsync 的情况下,没有理由使用 invalid 信息调用 UploadProgressChanged 事件 - 要么使用有效、正确的信息调用它,要么根本不调用它.

无论如何,试试 UploadFileAsync 看看效果如何。

【讨论】:

  • +1 感谢您花时间提供这个详细的答案,我会测试它并回来:)
  • Thx ,测试它,它解决了问题:S 但我觉得它有点愚蠢和不合逻辑..
猜你喜欢
  • 2011-06-10
  • 2018-07-02
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多