私のWinRTアプリケーション用の簡単なアルゴリズムを作った。クラスのWebレスポンスのストリームを持つ。私は "ProgressChanged"イベントと非同期にファイルをダウンロードする必要があります。ここに私の方法は次のとおりです。進捗値を持つ非同期ダウンロードアルゴリズム
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コード:
public class ProgressEventArgs : EventArgs
{
public ProgressEventArgs(double percentage)
{
Percentage = percentage;
}
public double Percentage { get; set; }
}
これが働いています。しかし、私はそれが速くなければならないと思います。シーケンシャルバイトの読み込みが遅すぎます。どうすれば速くすることができますか?私は初心者です。助けてください。
あなたが初心者であるという事実は問題ではありませんので気にしません。多分あなたは遅いネットワークを持っていますか?正確に何が遅いですか?ダウンロード?ファイルを読む?遅い特定の部品/ラインを参照することはできますか?方法全体が遅くなっていますか? – MichaelThePotato
ブロック中のストリームを読み込みます。私は、それは良い解決策ではないと思う。私が間違っている? – Alexey