Асинхронный метод WP8 в запланированной задаче

#c# #windows-phone-8 #asynchronous #scheduled-tasks

#c# #windows-phone-8 #асинхронный #запланированные задачи

Вопрос:

Я пытаюсь создать живую плитку, которая использует данные из метода DownloadStringAsync.

 protected override void  OnInvoke(ScheduledTask task){
  WebClient web = new WebClient();
  web.DownloadStringAsync(new Uri("website"));
  web.DownloadStringCompleted  = web_DownloadStringCompleted;
  StandardTileData data = new StandardTileData();
  ShellTile tile = ShellTile.ActiveTiles.First();
  data.BackContent = string;
  tile.Update(data);
}

void web_DownloadStringCompleted(object sender, 
                                 DownloadStringCompletedEventArgs e)
{
   string=e.result ; 
} // example
  

строка все время возвращает значение null. Я думаю, это из-за асинхронной работы. Каким-то образом, если я смогу синхронизировать его, возможно, это сработает. есть идеи? Спасибо

Ответ №1:

У вас есть условие гонки, поскольку операция загрузки является асинхронной, переменная ‘string’ (которая, кстати, не должна компилироваться) не будет обновляться, когда вы прочитаете ее значение, чтобы установить BackContent.

Попробуйте это с ключевыми словами Async / Await:

 protected async override void  OnInvoke(ScheduledTask task)
{
   var web = new Webclient();
   var result = await web.DownloadStringTaskAsync(new Uri("website"));
   StandardTileData data = new StandardTileData();
   ShellTile tile = ShellTile.ActiveTiles.First();
   data.BackContent = resu<
   tile.Update(data);
 }
  

Если вы не можете использовать DownloadStringTaskAsync в своем приложении WP8, попробуйте использовать TaskCompletionSource для выполнения того же, что и в примере в этом сообщении .

 protected async override void  OnInvoke(ScheduledTask task)
{
   var result = await DownloadStringTaskAsync (new Uri("website"));     
   StandardTileData data = new StandardTileData();
   ShellTile tile = ShellTile.ActiveTiles.First();
   data.BackContent = resu<
   tile.Update(data);
 }

   public Task<string> DownloadStringTaskAsync(Uri address)
   {
      var tcs = new TaskCompletionSource<string>();
      var client = new WebClient();
      client.DownloadStringCompleted  = (s, e) =>
      {
         if (e.Error == null)
         {
             tcs.SetResult(e.Result);
         }
         else
         {
             tcs.SetException(e.Error);
         }
     };

     client.DownloadStringAsync(address);

     return tcs.Task;
 }
  

Вот пример 1, пример 2 и пример 3 из MSDN для использования ключевого слова Async / Await с WebClient в Windows Phone 8.

Поскольку вы используете WP8, вам может потребоваться добавить пакет Nuget для ключевого слова Async / Await. просто запустите

установка-пакет Microsoft.Bcl.Async

В консоли диспетчера пакетов. Или используйте графический интерфейс Nuget для его загрузки (найдите «асинхронный»)

Комментарии:

1. привет, спасибо за ответ. для второй строки я заменил как » var result = await web. DownloadStringAsync(новый Uri («website»)); » его сообщение об ошибке не может ожидать «void» . Теперь я проверю ссылки на примеры

2. @user3343556 Пожалуйста, вызывайте DownloadStringTaskAsync, а не DownloadStringAsync 🙂