【问题标题】:Get String Windows Phone 8.1 through Background Task通过后台任务获取字符串 Windows Phone 8.1
【发布时间】:2014-07-03 03:43:42
【问题描述】:

我终于得到了一个后台任务,它可以向前台发送 Toast 通知。不幸的是,我遇到了一个问题。我的后台任务需要检查 rss 提要的更新,但是当我运行时

HttpClient hc = new HttpClient();
string result = await hc.GetString("http://url.com");

GetString 方法被触发后没有任何反应,没有返回,它永远不会跳转到下一行。我也试过BackgroundDownload,它也只是像httpclient一样停止,什么时候应该下载?

StorageFolder folder = ApplicationData.Current.TemporaryFolder;
StorageFile file = await folder.CreateFileAsync("feed.txt");
BackgroundDownloader test = new BackgroundDownloader();
DownloadOperation operation = test.CreateDownload(new Uri("https://url.com"), file);
operation.Priority = BackgroundTransferPriority.Default;
await operation.StartAsync();

我到处寻找这个问题的答案,但似乎找不到...那么我如何从网站获取字符串,就像使用 hc.GetString(""); 一样?

这是我的代码:

public async void Run(IBackgroundTaskInstance taskInstance)
{
    var deferral = taskInstance.GetDeferral();
    int lastSeenNews = Convert.ToInt32(Settings.GetValue("lastNews"));
    int lastNews = 0;
    HttpClient hc = new HttpClient();
    var rss = await hc.GetStringAsync("https://url.com");

    List<RSSItem> items = new List<RSSItem>();
    lastNews = items[0].id;
    if (lastSeenNews < lastNews)
    {
        int unreadNotifications = 0;
        List<RSSItem> unreadStatuses = items.Where(x => x.id > lastSeenNews).ToList();
        unreadNotifications = unreadStatuses.Count;
    }
    ToastTemplateType toastTemplate = ToastTemplateType.ToastText01;
    XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(toastTemplate);

    XmlNodeList toastTextElements = toastXml.GetElementsByTagName("text");
    toastTextElements[0].AppendChild(toastXml.CreateTextNode(Settings.GetValue("lastNews")));

    ToastNotification toast = new ToastNotification(toastXml);
    ToastNotificationManager.CreateToastNotifier().Show(toast);
    deferral.Complete();
}

【问题讨论】:

  • 您是否考虑过DownloadString 可能会抛出异常?将它包裹在 try-catch 中,看看你得到了什么......
  • 同样的,从那里永远不会继续,遗憾的是:(
  • @Romasz 这是一个虚拟 URL,不是我在应用中使用的实际 URL:P
  • 是的,对 :) 不过,当您尝试使用不同的网址时 - 它是否正确?
  • 我的应用程序本身使用相同的方法,工作正常:)

标签: c# windows-phone windows-phone-8.1


【解决方案1】:

我的猜测是后台任务正在终止,因为异步调用 hc.GetString()

您可以通过请求 BackgroundTaskDeferral 来解决此问题 - 有关代码示例,请参见 this quickstart about background tasks 中的步骤 4。

【讨论】:

  • 我想我已经在这样做了,我已经在上面添加了run方法:)
  • 我很困惑 - 为什么 Run() 方法被标记为异步,但我没有看到任何等待调用?
  • 没问题。嗯,如果它仍然在做同样的事情(当你越过它之后就再也不会回来了),你可以尝试将相同的代码放在一个“真实的”应用程序中,看看它是否会回来。您还应该打开在第一次机会异常时收到通知,以查看是否引发了异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多