【问题标题】:WebClient.UploadValuesAsync not updating progress properlyWebClient.UploadValuesAsync 未正确更新进度
【发布时间】:2011-01-22 14:37:05
【问题描述】:

我有一个 WebClient,我用它通过以下方式上传文件,base64Encoded 是一张编码为 base64 字符串的图片,这正是 imgur 服务器所期望的:

    public Upload()
    {
        WebClient webClient = new WebClient();
        webClient.UploadProgressChanged += new UploadProgressChangedEventHandler(webClient_UploadProgressChanged);
        webClient.UploadValuesCompleted += new UploadValuesCompletedEventHandler(webClient_UploadValuesCompleted);    

        NameValueCollection values = new NameValueCollection();
        values.Add("key", "imgur api key");
        values.Add("image", base64Encoded);
        webClient.UploadValuesAsync(new Uri("http://api.imgur.com/2/upload"), "POST", values);        
    }

这是 UploadProgressChanged 的​​事件处理程序:

    private void webClient_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
    {
        int percentage = e.ProgressPercentage * 2;

        progressBar.Value = percentage;
        percentageTextBlock.Text = (percentage).ToString() + "%";
    }

现在我的问题是事件处理程序只在开始时被调用一次,报告ProgressPercentage 为 50,然后不再被调用。文件上传成功,但我的进度条不起作用。这不是因为我上传了一个小文件,因为我也尝试过使用几个 mb 的文件,这些文件也立即报告了 50 个ProgressPercentagee.BytesSent 也无济于事,因为它也立即等于 e.TotalBytesToSend。这是怎么回事?

【问题讨论】:

    标签: c# .net progress-bar webclient


    【解决方案1】:

    有一个bug with this event 已在 .NET 4.0 中修复。这是related post

    【讨论】:

    • 我明白了。我将项目更改为针对 .NET 4.0 而不是 3.5,它确实运行良好。但是,我还不想使用 .NET 4.0,因为我的大多数用户仍将使用 .NET 3.5,并且不想仅为我的应用程序安装 4.0。有没有可能的解决方法?我是否应该在不同的线程上使用 UploadValues() 方法,然后自己更新 GUI?
    • @dimski,您需要自己实现进度,方法是直接分块写入请求流。恐怕你不能使用UploadValuesAsync,即使这是一个非常方便的方法。所以你可以使用OpenWriteAsync方法直接分块写入请求流并调用一些自定义事件来报告进度。
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多