gpt4 book ai didi

c# - WinRT DownloadProgress 回调进度状态

转载 作者:行者123 更新时间:2023-11-30 16:11:08 24 4
gpt4 key购买 nike

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

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

但是,除非我在方法中实际设置断点,否则进度回调似乎不适用于等待。

以下是我快速整理的示例应用程序的 list ,用于演示该行为:

型号:

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

public bool Done { get; set; }
}

MainPage 代码隐藏(我在这里创建一个数据库只是为了这个例子的目的!):

 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,我会收到两条调试消息,并且我的数据库会收到一条新记录。

但是,如果我只是让代码执行,我永远不会看到打印给我的“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 毫秒解决了这个问题,这对我来说非常有效。

关于c# - WinRT DownloadProgress 回调进度状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24720344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com