#c# #windows-phone #windows-phone-8.1
#c# #windows-phone #windows-phone-8.1
Вопрос:
Наконец-то у меня заработала фоновая задача, которая может отправлять всплывающие уведомления на передний план. К сожалению, я столкнулся с проблемой. Моей фоновой задаче необходимо проверить 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.Defau<
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();
}
Комментарии:
1. Вы рассматривали, что
DownloadString
это может вызывать исключение? Оберните ее в try-catch и посмотрите, что вы получите…2. То же самое, никогда не продолжается оттуда, к сожалению : (
3. @Romasz Это фиктивный URL, это не тот фактический URL, который я использую в своем приложении: P
4. Да, правильно 🙂 Тем не менее, когда вы пытаетесь использовать другой URL-адрес — правильно ли это работает?
5. Само мое приложение использует тот же метод, работает нормально 🙂
Ответ №1:
Я предполагаю, что фоновая задача завершается из-за асинхронного вызова hc.GetString()
Вы можете исправить это, запросив BackgroundTaskDeferral
— смотрите шаг 4 в этом кратком руководстве о фоновых задачах для примера кода.
Комментарии:
1. Я думаю, что я уже делаю это, я добавил метод run выше 🙂
2. Я в замешательстве — почему этот метод Run () помечен как асинхронный, но я не вижу там никаких вызовов await?
3. Нет проблем. Хм, если он все еще делает то же самое (никогда не возвращается после того, как вы перейдете через него), вы могли бы попробовать поместить тот же код в «реальное» приложение и посмотреть, вернется ли он когда-нибудь. Вы также должны включить получение уведомлений об исключениях первой возможности, чтобы увидеть, генерируется ли исключение.