【问题标题】:Wait till the downloading is finished Windows phone等到下载完成 Windows phone
【发布时间】:2013-11-29 12:48:48
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 根据代码,下载的文件是PNG图片。这些通常很小。
  • 除非您有完美的提供商和/或无限数据计划,否则即使是“小”尺寸也很重要。桌面上看起来“小”的东西在手机上却是“大”,尤其是在重复下载的情况下。事实上,人们可能还应该在下载任何内容之前检查 DataSense,看看客户是否接近他的下载限制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
相关资源
最近更新 更多