等到下载完成Windows手机

时间:2013-11-29 12:48:48

标签: c# windows-phone-8 async-await background-transfer

我怎么能等到下载操作完成并想要将状态返回true或者返回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)
{

}

}

问题是我无法使用等待,因为我正在使用OpenReadCompleted事件。如何使用WebClient.DownloadFileAsync转换上面的代码插件?或者有任何方式等待下载结束并返回状态

1 个答案:

答案 0 :(得分:3)

虽然您可以使用HttpClient或WebClient异步下载文件,但您只应对小文件(例如页面或源)执行此操作。这样做需要用户在文件传输需要的时候保持应用程序打开。这意味着,他不会关闭手机,切换到另一个应用程序或做任何会导致操作系统暂停您的应用程序的事情。

用户不会满意,您的代码必须处理不完整和中断的下载。

使用Background File Transfers要好得多。从本质上讲,您告诉操作系统您要下载哪个文件,要放在哪里,操作系统会尽可能在后台下载,提供有关传输过程的反馈。操作系统还会检查蜂窝或WiFi连接的状态。

检查How to implement background file transfers for 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);

要跟踪进度,您需要处理request's eventsTransferProgressChangedTransferStatusChanged