后台任务定期

Background Task periodic

我正在使用 C# 和 Windows Phone 8.1 作为通用应用程序。 我有一个可以在后台运行 运行 的应用程序。这是我的背景 class:

 public sealed class RTask : IBackgroundTask
 {
     BackgroundTaskDeferral deferral_;
     public async void Run(IBackgroundTaskInstance taskInstance)
     {
         Debug.WriteLine("Background started");
         deferral_ = taskInstance.GetDeferral();
         Debug.WriteLine("GetDeferral");


         Debug.WriteLine("Retrieving data from url...");
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("http://mysite"));
         HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
         string pageSource = new StreamReader(response.GetResponseStream()).ReadToEnd();
         Debug.WriteLine("PageSource Retrieved");
         pageSource = (System.Net.WebUtility.HtmlDecode(pageSource));
         pageSource = pageSource.Replace("\"", "'");
         //ParseHtml(pageSource);
         deferral_.Complete();
     }
 }

这是我注册后台的注册码:

    private async void RegisterBtn_Click(object sender, RoutedEventArgs e)
    {
        string myTaskName = "RTask";
        foreach (var cur in BackgroundTaskRegistration.AllTasks)
        {
            Debug.WriteLine("cur.Value.Name:   " + cur.Value.Name);
            if (cur.Value.Name == myTaskName)
            {
                await (new MessageDialog("Task already registered")).ShowAsync();
                return;
            }
        }
        await BackgroundExecutionManager.RequestAccessAsync();
        BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder { Name = "RTask", TaskEntryPoint = "MyTask.RTask" };
        taskBuilder.SetTrigger(new TimeTrigger(15, true));
        BackgroundTaskRegistration myFirstTask = taskBuilder.Register();

        await (new MessageDialog("Task registered")).ShowAsync();
    }

我每 1 小时需要一次此背景 运行 并检索我的数据。这可能吗 ?按代码是不能使用periodic的!我已经在 phone 中进行了测试,只有一次有效,然后什么也做不了。 如果我没有完成延期,有错吗?

在后台任务的微软示例中,他们使用了一个代码'ThreadPoolTimer'。就我而言,我是否需要这个?

谢谢

只需定期触发 false:

taskBuilder.SetTrigger(new TimeTrigger(60, false));

对于单发,它必须是 true,因此只有一个触发器。