I made simple algorithm for my WinRT app. Having a stream of class webresponse. I need to download file asynchronously with "ProgressChanged" event. Here is my method:
public async void DownloadFileAsync(string uri, StorageFile path)
{
var request = WebRequest.CreateHttp(uri);
var response = await request.GetResponseAsync();
if (response != null)
{
long totalBytes = response.ContentLength;
long writedBytes = 0;
using(var webStream = response.GetResponseStream())
using (IRandomAccessStream stream = await path.OpenAsync(FileAccessMode.ReadWrite))
using (DataWriter dataWriter = new DataWriter(stream))
{
await Task.Run(() =>
{
int b;
while ((b = webStream.ReadByte()) != -1)
{
dataWriter.WriteByte((byte)b);
writedBytes++;
if (writedBytes % (totalBytes / 100) == 0)
OnProgressChanged(new ProgressEventArgs(writedBytes / (totalBytes / 100)));
}
});
await dataWriter.StoreAsync();
OnDownloadComplete(new EventArgs());
}
}
}
ProgressEventArgs code:
public class ProgressEventArgs : EventArgs
{
public ProgressEventArgs(double percentage)
{
Percentage = percentage;
}
public double Percentage { get; set; }
}
This is working. But I think it's should be faster. Sequential bytes reading is too slow. How can I make it faster. I'm beginner. Please help.