2

Windows 8 Metro アプリのバックグラウンド タスクで実行すると、Client.GetAsync が失敗するように見えます。

TimeTrigger と MaintenanceTrigger の両方を使用してみました。例外はないようです。それをデバッグするとき、それはその行で終了します(ステップオーバーを押し続けると)、実行する方法が他にもあり、その周りにtry-catchがあります。

これにより、Windows がタスクをキャンセルしていると思われます。というわけで、運悪くキャンセルされたイベントを聞いてしまいました。

インターネット アクセスを機能として宣言し、タスクが適切に登録されました。さらに、私のアプリはロック画面に完全にアクセスできます。

私は何を間違っていますか?

現在、バックグラウンド タスクを登録するために使用しているコードを次に示します。

if (await ObtainLockScreenAccess())
{
    const string name = "Task";

    var updaterTasks = BackgroundTaskRegistration.AllTasks.Where(t => t.Value.Name == name);
    if (!updaterTasks.Any())
    {

        var builder = new BackgroundTaskBuilder();
        builder.Name = name;
        builder.TaskEntryPoint = "Stackstabilizer.BackgroundTasks.UpdateBackgroundTask";

        var trigger = new MaintenanceTrigger(15, false);
        var condition = new SystemCondition(SystemConditionType.InternetAvailable);

        builder.AddCondition(condition);
        builder.SetTrigger(trigger);

        var task = builder.Register();

        Debug.WriteLine("Task has been registered");

    }
}

編集バックグラウンド タスクのシグネチャは次のとおりです。

namespace Stackstabilizer.BackgroundTasks
{
    // You must use a sealed class, and make sure the output is a WINMD. 
    public sealed class UpdateBackgroundTask : IBackgroundTask
    {
        public async void Run(IBackgroundTaskInstance taskInstance)
        {

            var deferral = taskInstance.GetDeferral();

            try { ... } finally { deferral.Complete(); }

        }
     }

}

そして、ここに私の宣言の詳細があります。

ここに画像の説明を入力

4

1 に答える 1

2

私は以前にあなたと同様の問題を抱えていましたが、それを解決した方法は、非同期タスクで別の延期を行うことでした。非同期タスクがあるときはいつでも、延期が必要だという考えだと思います。(ベストプラクティスかどうかはわかりませんが、うまくいきます)

コード:

    public void Run(IBackgroundTaskInstance taskInstance)
    {
        updateAllTiles(taskInstance);
    }


    public async void updateAllTiles(IBackgroundTaskInstance taskInstance)
    {
        // Need to use a deferral to run async tasks in the background task
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

        dosomething(taskInstance);

        deferral.Complete();
    }

    private async void dosomething(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

        HttpClient client = new HttpClient();
        HttpResponseMessage resp = await client.GetAsync(new Uri(url));

        updateTile(resp);

        deferral.Complete();
    }
于 2012-11-07T11:44:37.377 に答える