Как рассчитать скорость загрузки в uwp backgrounddownloader?

как рассчитать задержку / скорость BackgroundDownload, например: 367 Кбит / с или 5 МБ / с?

до сих пор единственными известными мне потенциально полезными полями, предоставляемыми классом BackgroundDownloadProgress, являются BytesReceived и TotalBytesToReceive. сначала я подумал, что могу использовать поле BytesReceived, но потом понял, что это совокупные байты с начала операции загрузки, а не вновь полученный фрагмент / байты ..

available fields in BackgroundDownloadProgress

Я знаю, что должен быть способ добиться этого, потому что я видел, как команда Store реализовала это в приложении магазина:

enter image description here

BytesReceived на (n-й) секунде - BytesReceived на (n-1) -й секунде должен дать вам значение байтов, полученных между n-1 и n-й секундой. Это в основном то, что вам нужно ..
Pratyay 26.10.2018 05:46
1
1
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать таймер, который тикает с интервалом в 1 секунду и подсчитывает загруженные байты между двумя тиками.

Следующий код не отшлифован, он не форматирует скорость до МБ / с, и таймер продолжает тикать после завершения загрузки, а случай исключения, такой как отмена / перезапуск, не обрабатывается, я просто даю вам идею, как использовать таймер и счетчик для расчета.

DispatcherTimer timer;
ulong bytesReceivedAtLastTick;

private async void StartDownload()
{
    BackgroundDownloader downloader = new BackgroundDownloader();
    DownloadOperation download = downloader.CreateDownload(source, destinationFile);
    timer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };
    timer.Tick += (s, e) => {
        var bytesReceivedAtThisTick = download.Progress.BytesReceived;
        var bytesPerSecond = bytesReceivedAtThisTick - bytesReceivedAtLastTick;
        Log($"Download speed: {bytesPerSecond} B/s");
        bytesReceivedAtLastTick = bytesReceivedAtThisTick;
    };
    timer.Start();

    await download.StartAsync().AsTask(cts.Token, progressCallback);
}

Другие вопросы по теме