编辑:链接的#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
以及我可以看到的更快速的方式更新进度条?