C# WebClient异步上载进度百分比始终返回50%

C# WebClient异步上载进度百分比始终返回50%,c#,.net,webclient,progress,uploaddataasync,C#,.net,Webclient,Progress,Uploaddataasync,我使用Webclient通过异步调用将数据上传到服务器 WebClient webClient = new WebClient(); webClient.UploadDataAsync(uri , "PUT", buffer, userToken); 我已将DatauploadProgress和DatauploadCompleted事件附加到相应的回调函数 // Upload Date Progress webClient.UploadProgre

我使用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(例如:如果文件大小为63000,我会得到
e.BytesSent=63000
e.ProgressPercentage=50


有人能告诉我这个问题吗?

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

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

您需要的是改用UploadFileAsync,它将正确调用UploadProgressChanged事件。然后,您可以通过Tessent和TotalByTestsEnd查看事件args属性,这两个属性应该正确反映出来

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


无论如何,给UploadFileAsync一个机会,看看结果如何。

+1为了花时间提供这个详细的答案,我将测试它并返回:)Thx,tested,它解决了这个问题:但是我觉得它有点愚蠢和不合逻辑。UploadDataAsync实际上支持PUT方法吗?我在这个页面上有一个表单,我可以作为文件上传的url提交对表单操作的调用吗?