定时任务中的WP8异步方法

本文关键字:异步方法 WP8 定时任务 | 更新日期: 2023-09-27 18:10:11

我正在尝试使用DownloadStringAsync方法中的数据制作live tile。

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

string一直返回null。我认为这是因为异步操作。如果我能让它同步也许就能成功。有什么想法吗?由于

定时任务中的WP8异步方法

你有一个竞争条件因为下载操作是异步的,'string'变量(不应该编译BTW)将不需要更新当你将读取它的值来设置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 = result;
   tile.Update(data);
 }

如果你不能在WP8应用程序中使用DownloadStringTaskAsync,那么尝试使用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 = result;
   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:在Windows Phone 8中使用Async/Await关键字。

由于您使用的是WP8,那么您可能需要为Async/Await关键字添加Nuget包。直接运行

安装包Microsoft.Bcl.Async

在包管理器控制台。或者使用Nuget GUI下载(搜索'async')