后台任务定期

时间:2015-03-30 06:44:34

标签: c# windows-phone-8.1 win-universal-app

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

 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小时运行一次后台并检索我的数据。这可能吗 ?根据代码,它不能定期使用!我在手机上进行了测试,只有一次正在工作,然后就没事了。 如果我没有完成延期,那就错了吗?

在后台任务的Microsoft示例中,他们使用了代码' ThreadPoolTimer'。在我的情况下,我需要这个吗?

Thannks

1 个答案:

答案 0 :(得分:2)

只需定期触发false

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

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