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实际上,我认为这更多地与检查状态有关。例如,检查之外的语句只执行一次,而检查内部的任何语句都不会执行。
有没有办法在下载完成后强制调用回调?
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");
}
这让我每次都要"完成"。