0

我怎样才能等到下载操作完成并想要将状态真或假返回给 UI。现在我正在使用 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 转换上述代码块?或者有什么方法可以等到下载结束并返回状态

4

1 回答 1

3

虽然您可以使用 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);

要跟踪进度,您需要处理请求的事件TransferProgressChangedTransferStatusChanged

于 2013-11-29T15:05:26.067 回答