9

Windows 8 アプリの場合、C#/Xaml でバックグラウンド タスクを登録しようとします。わかりにくいですが、バックグラウンド タスクは適切に登録されていると思いますが、デバッグ ロケーション ツールバーでバックグラウンド タスクの名前をクリックすると、メッセージが表示されずにアプリが停止します。

イベント ビューアのログを確認すると、「エントリ ポイントが MyApp.Pages.SampleBackgroundTask で名前が 1 時間ごとのバックグラウンド タスクの例のバックグラウンド タスクが、エラー コード 0x80010008 でアクティブ化できませんでした」というメッセージが表示されます。

これが私のコードです:

   private async void Button_Click_BackgroundTask(object sender, RoutedEventArgs e)
    {
        string entryPoint = "MyApp.Pages.SampleBackgroundTask";
        string taskName = "Example hourly background task";
        TimeTrigger hourlyTrigger = new TimeTrigger(60, false);

        BackgroundTaskRegistration myBackGroundTaskRegistration =   RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, null);
        if(myBackGroundTaskRegistration != null)
        AttachProgressAndCompletedHandlers(myBackGroundTaskRegistration);
    }


   public static BackgroundTaskRegistration RegisterBackgroundTask(String taskEntryPoint,
                                                                    String name,
                                                                    IBackgroundTrigger trigger,
                                                                    IBackgroundCondition condition)
    {

        var taskRegistered = false;
        var iter = Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks;

        foreach (var item in iter)
        {
            var task = item.Value;
            if (task.Name == name)
            {
                taskRegistered = true;
                return item.Value as BackgroundTaskRegistration;
            }
        }


        var builder = new BackgroundTaskBuilder();

        builder.Name = name;
        builder.TaskEntryPoint = taskEntryPoint;
        builder.SetTrigger(trigger);

        if (condition != null)
        {

            builder.AddCondition(condition);
        }

        BackgroundTaskRegistration taskBack = builder.Register();

        return taskBack;
    }


       private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task)
    {
        task.Progress += new BackgroundTaskProgressEventHandler(OnProgress);
        task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
    }


  private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
    {
        var progress = "Progress: " + args.Progress + "%";

    }


    private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
    {
        Debug.WriteLine("Hi");
    }

これをマニフェストに追加しました:

      <Extension Category="windows.backgroundTasks" EntryPoint="MyApp.Pages.SampleBackgroundTask">
      <BackgroundTasks>
        <Task Type="timer" />
      </BackgroundTasks>
    </Extension>

私は何かを忘れましたか?

ご協力ありがとうございました。

編集:これが私のプロジェクトページの1つにある私のタスクのコードです:

      public sealed class SampleBackgroundTask : IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();

        _deferral.Complete();
    }
}
4

5 に答える 5

6

私もこの問題を抱えていました。私も同じプロジェクトに参加していました。タスクを別のプロジェクトに移動することで、ようやく機能するようになりました。プロジェクトの出力をWindowsランタイムコンポーネント([プロパティアプリケーション]タブの下)として設定する必要がありました。また、参照としてプロジェクトを追加することを忘れないでください。

于 2012-11-12T03:19:23.943 に答える
3

BackgroundTask を実行する前に、ユーザーの許可が必要です。手動で行うこともできます。アプリを開き、設定チャームの [アクセス許可] をクリックして、ロック画面の設定をオンにします。

最初の画面がこれでロードされたときに、ユーザーにプロンプ​​トを表示することもできます。

BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

言うまでもなく、後者ははるかに優れたユーザーエクスペリエンスにつながります.

于 2012-12-27T09:15:11.230 に答える
3

2 年後、現在は Windows 10、Visual Studio 2015 の WinRT です。これもまた同じ問題です。

質問者は、バックグラウンド タスクが同じプロジェクトにあることを示しました。それはうまくいきません: バックグラウンド タスクに関する非常に詳細な記事はこちらです。また、ティムが指摘したように、BackgroundExecutionManager.RequestAccessAsync() を最初に呼び出す必要があります。ただ、8.1以降はそれを省略した場合、その場合バックグラウンドタスクの登録に失敗するため、タスクトリガーが失敗するところまでたどり着くことはありません。

要件をまとめると、次のようになります。

  • 'await BackgroundExecutionManager.RequestAccessAsync()' 最初に
  • タスク クラスは Windows ランタイム コンポーネント プロジェクトにある必要があります
  • 呼び出し元のアプリで Windows ランタイム コンポーネント プロジェクトを参照する必要があります。
  • タスク クラスは、完全な名前空間名を使用して、上記のようにアプリのマニフェストで宣言する必要があります。
  • Windows ランタイム コンポーネント プロジェクトとそれを使用するアプリは、同じ Windows バージョンをターゲットにする必要があります。Visual Studio のソリューション エクスプローラー -> プロジェクトを右クリック -> プロパティ -> アプリケーション担当者。[ライブラリ] タブ -> [ターゲット設定] -> [ターゲット] および [ターゲット バージョン]。

私の例では、間違いなくこれらすべてを実行しましたが、タスクはトリガーされませんでした。デバッグ トレースは、「プログラム '[0x72C] backgroundTaskHost.exe' はコード 1 で終了しました」を示し、デバッガーは ExecutionEngineException で中断し、ターゲット マシンのイベント ログ (アプリケーションとサービス ログ -> Microsoft -> Windows -> BackgroundTaskInfrastructure -> Operational) には、すべての種類のクリエイティブで完全に文書化されていない Windows エラー コードがリストされています。

「エントリ ポイントと名前を持つバックグラウンド タスクは、エラー コード 0x8007001F (それぞれ 0x800706BE / 0x80131509) でアクティブ化できませんでした。」

失敗は不安定でした。最初はめったに発生せず、バックグラウンド タスクが呼び出されなくなるまで、プログラムを数回連続して実行すると悪化しました。

バックグラウンド タスクの名前空間名が (すべてのタスク登録、パッケージ マニフェスト、およびコードで) 変更されると、最初はエラーが修正されましたが、時間の経過とともに悪化しました。

この場合の特別な状況は、アプリがリモート ターゲット マシンで開発され、リモート デバッガーでデバッグされたことです。各デバッガーの実行前にアプリ パッケージを削除すると、エラーが解消されます。

したがって、バックグラウンド タスク (0x8007001F / 0x800706BE / 0x80131509) を実行するときのこれらのエラーは、登録されたタスクが正しく見つからないことに関係しているようです。タスクが正しく登録解除されていることを確認し、新しい変更を実行する前にアプリ パッケージを削除すると役立つ場合があります。Powershell コマンド:

Get-AppPackage | where name -eq <myAppPackageGuid> | Remove-AppPackage

誰かが同じ問題を抱えている場合に備えて、ここにこれを文書化するだけです。

于 2016-05-05T08:55:44.567 に答える
2

バックグラウンド タスク プロジェクトを参照時にメイン プロジェクトに追加し、再構築します。それが動作します

于 2013-01-27T09:02:09.423 に答える