0

我正在开发一个 Windows 8 Metro RSS Feed 应用程序。因此,我正在实施一个后台任务来检查是否有新的提要可用,如果有则通知用户。我这样做如下:

public sealed class UpdateCheck : IBackgroundTask
{
  public async void Run(IBackgroundTaskInstance taskInstance)
  {
    BackgroundTaskDeferral backgroundTaskDeferral = taskInstance.GetDeferral();

    await StartUpdateCheck();

    backgroundTaskDeferral.Complete();
  }

  public IAsyncAction StartUpdateCheck()
  {
    return ThreadPool.RunAsync(async o =>
      { 
        SyndicationClient client = new SyndicationClient();
        SyndicationFeed feed = await client.RetrieveFeedAsync(new Uri("http://.../feed.xml"));

        ApplicationDataContainer applicationDataContainer = ApplicationData.Current.LocalSettings;
        string lastFeedId = (string) applicationDataContainer.Values["LastFeedId"];

        if (lastFeedId != feed.Items.First().Id)
        {
          // inform user
        }
      });
  }
}

当我正在调试代码并且我想SyndicationFeed feed = await client.RetrieveFeedAsync(new Uri("http://.../feed.xml"));通过按 F10 来跨行时,没有任何反应。进一步的代码行不会被执行。所以,当我在方法之前RetrieveFeedAsync设置断点时,断点会被命中。这一行之后,没有断点被命中。

我正在阅读代码中另一个位置的 RSS-Feed,它不是 BackgroundTask(而不是在ThreadPool.RunAsynclambda 表达式中),并且一切正常,因此该ThreadPool.RunAsync方法可能会导致问题。

4

1 回答 1

1

后台任务中不需要 ThreadPool.RunAsync,它已经在单独的线程中运行。

于 2012-12-29T10:42:42.537 回答