簡體   English   中英

如何將后台任務添加到Windows應用商店應用

[英]How to add background task to Windows Store App

使用c#,VS 2013

嘗試將一些后台任務添加到我的商店應用程序(如果我的Json文件中的某些數據包含當前日期和時間,則顯示toast的想法)。

做了什么:

1. 創建實現IBackgroundTask Windows運行時組件 ,添加對我的Windows應用商店應用的引用。 在WRC內部創建包含下一個代碼的類:

namespace BackgroundTask
{
public sealed class EventChecker: IBackgroundTask
{
    ThreadPoolTimer  _periodicTimer = null;
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        _periodicTimer 
            = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromSeconds(30));
    }

    private void PeriodicTimerCallback(ThreadPoolTimer timer)
    {
        CheckEventAndShowToast();
    }
     ....
}

2. 注冊任務 :在MainPage.xaml.cs中添加方法OnNavigatedTo注冊OnNavigatedTo任務。 碼:

        protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        navigationHelper.OnNavigatedTo(e);

        var taskName = "EventCheckerTask";
        if (BackgroundTaskRegistration.AllTasks.Count > 0)
        {
            foreach (var cur in BackgroundTaskRegistration.AllTasks)
            {
                if (cur.Value.Name != taskName)
                {
                    BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
                    builder.Name = taskName;
                    builder.TaskEntryPoint = "BackgroundTask.EventChecker";
                    BackgroundTaskRegistration taskToRegister = builder.Register();
                }
            }
        }
        else
        {
            BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
            builder.Name = taskName;
            builder.TaskEntryPoint = "BackgroundTask.EventChecker";
            BackgroundTaskRegistration taskToRegister = builder.Register();
        }
    }

使用MSDN1MSDN2MSDN3鏈接。

OnComplete沒有實現 - 因為我不需要它(或者我必須實現它?)

3. 在清單中聲明。

設置能夠“是”的吐司:

在此輸入圖像描述

聲明后台任務:

在此輸入圖像描述

4.檢查我想用於背景的所有方法的功能 - 一切都好,工作

Durring調試一切正常,沒有錯誤/異常,但沒有發生任何事情。 嘗試逐步調試 - 看起來一切都好,想想我在代碼中犯了一些錯誤。

所以問題 :我錯了,為什么我無法啟動必須檢查數據的后台任務,如果需要某些條件則需要采取必要的措施?

編輯


第2部分 - 嘗試在新解決方案中實現后台任務。

做了什么:創建新的簡單CRC

namespace Tasks
{
public sealed class Tasks : IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        //for checking place debug point
       //TODO something 
    }
}
}

另外在main.xaml.cs中放置下一個代碼:

protected override void OnNavigatedTo(NavigationEventArgs e)
    {           
        CheckTaskRegistration();
    }
    private void CheckTaskRegistration()
    {
        foreach (var task in BackgroundTaskRegistration.AllTasks)
        {
            if (task.Value.Name == "Tasks")
            {
                isTaskRegistered = true;
                break;
            }
        }
        if (!isTaskRegistered)
        {
            RegisterBackgroundTask2("Tasks", "Tasks.Tasks");
        }
    }

    private void RegisterBackgroundTask2(string name, string entrypoint)
    {
        BackgroundTaskBuilder btb = new BackgroundTaskBuilder();
        btb.Name = name;
        btb.TaskEntryPoint = entrypoint;
       //IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(1, false);
       // btb.SetTrigger(everyMinuteTrigger);
        btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
        BackgroundTaskRegistration task = btb.Register();
    }

結果得到了,用這個觸發器btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false)); 一切正常 - 我可以進入Run方法,但是如果我嘗試使用TimeTrigger就好了

       //IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(1, false);
       // btb.SetTrigger(everyMinuteTrigger);

什么都沒發生 - 等幾分鍾嘗試幾次(放置而不是觸發注冊)。

問題 - 為什么? 我必須做更多的事情嗎? 老問題也沒有答案......

也嘗試將它與我的應用程序一起使用 - 所有工作都是完美的,但只有當我連接到局域網...但為什么它不適用於時間觸發?

花一點時間,發現我的問題的根本原因很少:

  1. 如果我想使用它並啟動,我必須使用我的BackgroundTask的一些觸發器。 這里的問題並不完全是我需要的東西(或者我可能需要閱讀更多關於觸發器的內容)。 因此,如果我添加一些觸發器,可以在發生此類事件后啟動BackgroundTask。 例:

     //Time trigger IBackgroundTrigger everyMinuteTrigger = new TimeTrigger(15, false); btb.SetTrigger(everyMinuteTrigger); //one of the standart tirgger btb.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false)); 
  2. 如果我想使用TimeTrigger,在EDIT中我用TimeTrigger(1, false);編寫代碼TimeTrigger(1, false); ,但在閱讀了一些更詳細的文檔后發現“時間觸發器只接受大於或等於15的值;較小的值在寄存器期間失敗”。 MSDN

  3. 此外,如果我想使用TimeTrigger,我必須將LockScreenNotification支持添加到我的應用程序

目前我可以每15分鍾啟動一次backgroundTask,但這並不是我想要的...所以,對於這個后期的問題 - 我找到了答案,但仍需要更深入地閱讀BackgroundTask

是你的CheckEventAndShowToast(); 什么異步調用?

如果是這種情況,那么您應該從您發布的MSDN2鏈接中執行步驟4。

“4.如果在后台任務中運行任何異步代碼,則后台任務需要使用延遲。如果不使用延遲,則后台任務進程可能會在異步方法之前完成Run方法時意外終止電話已經完成。“

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM