WinRT下载进度回调进度状态

本文关键字:状态 回调 下载 WinRT | 更新日期: 2023-09-27 18:12:44

我正在使用SQLite net编写一个主要针对Windows Phone的通用应用程序。

在操作过程中,用户可以选择下载多个文件。在每次文件下载结束时,我需要将数据库中的文件标记为已完成。我使用BackgroundDownloader下载文件-WP8.0应用程序使用了后台传输服务,效果很好。文件可能很大(大约200多MB,用户内容(,我不期待在HttpClient或WebClient中包装下载。

然而,进度回调似乎无法处理waiting,除非我在方法中实际断点。

以下是我快速整理的一个示例应用程序的列表,展示了这种行为:

型号:

   public class Field
  {
    [PrimaryKey]
    [AutoIncrement]
    public int Id { get; set; }
    public bool Done { get; set; }
  }

MainPage codebehind(我在这里创建一个数据库只是为了这个例子!(:

 private async void Button_Click(object sender, RoutedEventArgs e)
{
  using (var db = new SQLiteConnection(Windows.Storage.ApplicationData.Current.LocalFolder.Path + "//Main.db"))
  {
    db.CreateTable<Field>();
    db.Commit();
  }
  this.DbConnection = new SQLiteAsyncConnection(Windows.Storage.ApplicationData.Current.LocalFolder.Path + "//My.db");
  var dl = new BackgroundDownloader();
  dl.CostPolicy = BackgroundTransferCostPolicy.Always;
  var transferUri = new Uri("http://192.168.1.4/hello.world", UriKind.Absolute);
  var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(
    "Content",
    CreationCollisionOption.OpenIfExists);
  var localFile = await folder.CreateFileAsync("cheesecakes.file", CreationCollisionOption.ReplaceExisting);
  var d = dl.CreateDownload(transferUri, localFile);
  d.Priority = BackgroundTransferPriority.High;
  var progressCallback = new Progress<DownloadOperation>(this.DownloadProgress);
  await d.StartAsync().AsTask(progressCallback);
}
private async void DownloadProgress(DownloadOperation download)
{
  Debug.WriteLine("Callback");
  if (download.Progress.Status == BackgroundTransferStatus.Completed)
  {
        var f = new Field();
        f.Done = true;
        await this.DbConnection.InsertAsync(f);
        Debug.WriteLine("DONE");
   }
}

如果我在DownloadProgress中断点,然后按F5,我会得到两条Debug消息,我的数据库会得到一条新记录。

然而,如果我只是让代码执行,我永远不会看到打印给我的"DONE",我的数据库也不会更新。

我尝试将代码包装在一个新任务中:

await Task.Run(
      async () =>
      {
        Debug.WriteLine("taskrun");
       .... OTHER CODE FROM ABOVE...
      });

但同样,只有当我在回调中断点时,我才能看到"taskrun"。

UPDATE实际上,我认为这更多地与检查状态有关。例如,检查之外的语句只执行一次,而检查内部的任何语句都不会执行。

有没有办法在下载完成后强制调用回调?

WinRT下载进度回调进度状态

private async void DownloadProgress(DownloadOperation download)
{
    Debug.WriteLine("Callback");
    var value = download.Progress.BytesReceived * 100 download.Progress.TotalBytesToReceive;
    new System.Threading.ManualResetEvent(false).WaitOne(1000);
    if (download.Progress.Status == BackgroundTransferStatus.Completed )
    {
        var f = new Field();
        f.Done = true;
        await this.DbConnection.InsertAsync(f);
        Debug.WriteLine("DONE");
    }
}

我也有这个问题,我通过睡1000毫秒解决了这个问题,这对我来说非常有效。

不确定是什么原因导致了这种情况,但我能够通过手动检查要下载的字节来让示例应用程序可靠地工作,而不是依赖DownloadOperation.Progress.Status:

 private async void DownloadProgress(DownloadOperation download)
{
  Debug.WriteLine("Callback");
  var value = download.Progress.BytesReceived * 100 / download.Progress.TotalBytesToReceive;
  if (download.Progress.Status == BackgroundTransferStatus.Completed || value >= 100)
  {
    var f = new Field();
    f.Done = true;
    await this.DbConnection.InsertAsync(f);
    Debug.WriteLine("DONE");
  }

这让我每次都要"完成"。