C# WinRT下载进度回调进度状态

C# WinRT下载进度回调进度状态,c#,sqlite,windows-runtime,windows-phone-8.1,C#,Sqlite,Windows Runtime,Windows Phone 8.1,我正在编写一个通用应用程序,主要针对使用SQLite net的Windows Phone 在操作过程中,用户可以选择下载多个文件。在每次文件下载结束时,我需要将数据库中的文件标记为已完成。我使用BackgroundDownloader来下载文件——WP8.0应用程序使用了后台传输服务,效果非常好。文件可能是巨大的(大约200多MB,用户内容),我不希望在HttpClient或WebClient中包装下载 然而,除非我在方法中实际设置了断点,否则进程回调似乎不适用于等待 以下是我快速组合的示例应用

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

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

然而,除非我在方法中实际设置了断点,否则进程回调似乎不适用于等待

以下是我快速组合的示例应用程序的列表,演示了该行为:

型号:

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

    public bool Done { get; set; }
  }
MainPage codebehind(我在这里创建db仅用于本示例的目的!):

但同样,只有在回调中设置断点时,才能看到“taskrun”

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


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

不确定是什么原因导致了这种情况,但我能够通过手动检查要下载的字节,而不是依赖于
下载操作,从而使示例应用程序可靠地工作。进度。状态

 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");
  }
这让我每次都“完成”

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毫秒解决了这个问题,这对我来说非常有效。

我不得不在我的应用程序中使用同样的方法。完成似乎从来没有被要求自己!很高兴我不是一个人!未完成,但问题是GetCurrentDownloadsAsync也返回以前的下载,请参阅
 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");
  }
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");
    }
}