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