Дождитесь окончания загрузки Windows Phone

Как я могу ждать, пока операция загрузки не закончится, и хочу вернуть статус true или false обратно в пользовательский интерфейс. Теперь я использую Webclient для загрузки изображения, как это

 private async Task SaveCoversAsync(string CoverImageUrl)
{
WebClient getImageClient = new WebClient();
getImageClient.OpenReadCompleted += new OpenReadCompletedEventHandler(getImageClient_OpenReadCompleted);
getImageClient.OpenReadAsync(new Uri(CoverImageUrl), CoverImageUrl);
}

private async void getImageClient_OpenReadCompleted(object sender,   OpenReadCompletedEventArgs e)
{
try
{

    var storeFile = IsolatedStorageFile.GetUserStoreForApplication();
    string coverpath = string.Concat("filename.png");
    using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(coverpath, System.IO.FileMode.Create, FileAccess.Write, FileShare.Write, storeFile))
    {
        byte[] buffer = new byte[1024];
        while (e.Result.Read(buffer, 0, buffer.Length) > 0)
        {
            stream.Write(buffer, 0, buffer.Length);
        }
    }
}
catch (Exception exe)
{

}

}

Проблема в том, что я не могу использовать await, так как я использую событие OpenReadCompleted. Как я могу преобразовать вышеупомянутый кодовый блок, используя WebClient.DownloadFileAsync? Или есть какой-либо способ дождаться окончания загрузки и возврата статуса

1 ответ

Хотя вы можете использовать HttpClient или WebClient для асинхронной загрузки файлов, вы должны делать это только для небольших файлов (например, страниц или каналов). Для этого необходимо, чтобы пользователь оставлял ваше приложение открытым в течение всего времени, необходимого для передачи файла. Это означает, что он не закрывает телефон, не переключается на другое приложение и не делает ничего, что заставит ОС приостановить ваше приложение.

Пользователь не будет счастлив, и ваш код будет обрабатывать неполные и прерванные загрузки.

Гораздо лучше использовать фоновые передачи файлов. По сути, вы сообщаете ОС, какой файл вы хотите загрузить, куда вы хотите поместить его, и ОС по возможности заботится о его загрузке в фоновом режиме, обеспечивая обратную связь о процессе передачи. ОС также проверяет состояние сотового или WiFi-соединения.

Посмотрите пример в разделе Как реализовать фоновую передачу файлов для Windows Phone, чтобы увидеть двухстраничное приложение, которое создает новые объекты BackgroundTransferRequest, а затем отслеживает их ход.

Необходимый код довольно прост. Вы создаете новый объект BackgroundTransferRequest, устанавливаете пути и предпочтения (например, используете сотовую связь или нет) и передаете его в BackgroundTransferService.Add для выполнения:

var transferRequest = new BackgroundTransferRequest(transferUri);
transferRequest.Method = "GET";
transferRequest.DownloadLocation = downloadUri;
if (wifiOnlyCheckbox.IsChecked == false)
{
  transferRequest.TransferPreferences = TransferPreferences.AllowCellular;
}
BackgroundTransferService.Add(transferRequest);

Чтобы отслеживать прогресс, вам нужно обработать события запроса, TransferProgressChanged и TransferStatusChanged

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