c# - WebClient AsyncUpload 进度百分比始终返回 50%

标签 c# .net webclient progress uploaddataasync

我正在使用 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

有人可以向我指出问题吗?

最佳答案

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

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

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

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

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

关于c# - WebClient AsyncUpload 进度百分比始终返回 50%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2140195/

相关文章:

c# - 调试 .net 的 WebClient

java - weblogic 上的 JAXWS Client ServiceConfigurationError

c# - 释放(放下)正在拖动的对象

c# - ClassInitialize : no longer working in Visual Studio 2012 中生成的数据驱动测试

.net - 在CF.NET 2.0中播放WMA文件

c# - ICollection<T>.Contains 自定义类型

c# - 这个查询是在内存中的集合上执行的,还是在数据库中执行的?

c# - Xamarin - 在表单中显示二维码

c# - 由于在另一个线程中创建 ReportViewr 而导致窗口布局更改时,在非常复杂的 WPF 应用程序中卡在未知位置

c# - 使用 WebClient 访问本地文件