来自Stream Async的Windows RT App更新进度条

时间:2015-02-23 19:52:55

标签: c# asynchronous windows-applications

编辑:链接的#34;相同的问题"似乎是常规的Windows窗体应用程序,而不是具有有限的.NET库的Windows RT。

我正在开发一个Windows应用程序,它能够将zip文件上传到具有进度的服务器。我正在使用自定义Stream类来处理进度更新。流类如下(片段):

 public class RTMStreamWithProgress : System.IO.Stream
    {
        private readonly System.IO.Stream file;
        private readonly long length;
        private long bytesRead;

        public event EventHandler<decimal> ProgressChanged;

        public RTMStreamWithProgress(System.IO.Stream file)
        {
            this.file = file;
            length = file.Length;
            bytesRead = 0;
            if (ProgressChanged != null)
            {

                ProgressChanged(this, 0);
            }
        }

        public override int Read(byte[] buffer, int offset, int count)
        {
            int result = file.Read(buffer, offset, count);
            bytesRead += result;
            if (ProgressChanged != null)
            {
                ProgressChanged(this, (decimal)((double)bytesRead/(double)length));
            }
            return result;
        }

        //more stuff
    }

然后在我的应用程序中,我使用它来尝试将文件上传到服务器:

//Initialize updateable stream
RTMStreamWithProgress progStream = new RTMStreamWithProgress(zipAsStream);
progStream.ProgressChanged += upload_ProgressChanged;

private async void upload_ProgressChanged(object sender, decimal e)
{
    Debug.WriteLine((e * 100).ToString());
    await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        HubDataContext globalContext = (HubDataContext) Application.Current.Resources["GlobalDataContext"];
        globalContext.SubProgressValue = Convert.ToDouble(e * 100);
    });

}

ProgressBar的{​​{1}}绑定到我要更新的Value属性。我的问题是,我可以通过SubProgressValue在控制台中看到流的读取速度非常快,而且我每秒可以多次快速更新,例如:

Debug.Writeline

但进度条在整个上传过程中只更新了2到3次,而且它更新的值似乎是随机的(但仍然是0.0086728887868017600 0.1474391093756300 2.3676986387968800 4.5879581682181300 6.8082176976393800 //so on and so forth... 报告的值之一。我之所以如此在upload_ProgressChanged内部进行绑定更新是因为没有它就无法工作,导致崩溃与尝试从单独的线程访问UI有关。

如何在保持this.Dispatcher...设计的同时,使用Debug.WriteLine以及我可以看到的更快速的方式更新进度条?

0 个答案:

没有答案