2016-08-30 7 views
1

私のUWPアプリでは、私はTimeTriggerによってトリガされたバックグラウンドタスクを持っています。バックグラウンドタスクのコードでは、私はこのスニペット(「最初のアクティビティ」と私の例では「第二の活動は」ほとんどすべてのリソースを消費する)があります。UWP:(TimeTriggerを使用して)バックグラウンドタスクでCPUクォータを超えるのはなぜですか?

var deferral = args.TaskInstance.GetDeferral(); 
await Task.Run(async() => 
{ 
    //... first activity 

    await Task.Delay(TimeSpan.FromSeconds(90.0)); 

    //... second activity, 90 seconds later 

}); 

だから私の質問は以下のとおりです。

  1. なぜドキュメンテーションでは「バックグラウンドタスクは30秒のウォールクロック使用に制限されています」と明記されているので、上記のコードは機能しますか?

  2. ここで、TriggerTypeごとに記載されているCPU割当量は?ドキュメントは明確に「バックグラウンドタスクは壁時計の使用量の30秒に制限されている」と言うよう

答えて

3

1.Whyは、上記のコードの動作しますか?

それはBackground task resource constraintsに言われたよう:

バックグラウンドタスクは、壁時計の使用量の30秒に制限されています。

この制約はTimeTriggerにも適用されます。しかし、あなたのコードは動作しますが、これはVisual Studioであなたのバックグラウンドタスクをデバッグしているからです。 Visual Studioデバッガが接続されると、Visual Studioはバックグラウンドタスクを制御します。バックグラウンドタスクは、開発者がデバッグを手助けするためのものです。デバッガを使用しないと、CPUクォータを超えるバックグラウンドタスクはOSによってキャンセルされます。例えば

、我々は次のようなバックグラウンドタスクを使用する場合:

public sealed class MyBackgroundTask : IBackgroundTask 
{ 
    public async void Run(IBackgroundTaskInstance taskInstance) 
    { 
     var deferral = taskInstance.GetDeferral(); 
     var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("Test.txt", CreationCollisionOption.OpenIfExists); 
     await FileIO.AppendTextAsync(file, $"{DateTime.Now.ToString()} first activity{Environment.NewLine}"); 

     await Task.Delay(TimeSpan.FromSeconds(90.0)); 

     await FileIO.AppendTextAsync(file, $"{DateTime.Now.ToString()} second activity{Environment.NewLine}"); 

     deferral.Complete(); 
    } 
} 

をしてから、このアプリのパッケージをサイドローディングしてテスト。 (UWPアプリのサイドロード方法については、Packaging UWP appsを参照してください)。バックグラウンドタスクがトリガーされると、我々は(このファイルは通常%USERPROFILE%\AppData\Local\Packages\{Package family name}\LocalStateの下にある)Test.txtをファイルで見つけることができ、出力は次のようなものです:

9/2/2016 3:06:35 PM first activity 
9/2/2016 3:20:15 PM first activity 

があるだけで、「最初のアクティビティ」ノー "第二の活動 "と呼ばれる。そしてイベントビューに、我々は次のような情報を得ることができます。
enter image description here これらの情報は、運用→マイクロソフト→Windowsの→BackgroundTaskInfrastructure→アプリケーションとサービスログの下にあります。

2. CPUクォータは、TriggerTypeごとに文書化されていますか?

トリガータイプごとのCPU割り当てに関するドキュメントはありません。参考Background task guidance

CPUクォータ:バックグラウンドタスクは、それらがトリガータイプに基づいて取得壁時計の使用時間の量によって制限されています。ほとんどのトリガは30秒のウォールクロック使用に制限されていますが、集中トリガを完了するためには最大10分間まで実行できる機能もあります。 ApplicationTriggerMaintenanceTriggerDeviceUseTriggerなどの

ごく少数のトリガーは、30秒より長い使用法を持っています。バックグラウンドタスクは、バッテリ寿命を節約し、フォアグラウンドアプリケーションのユーザーエクスペリエンスを向上させるため、軽量でなければなりません。軽量コードをバックグラウンドで実行し、30秒以内に終了させることをお勧めします。

+0

素晴らしい回答です。 – Martin777

+0

あなたは「トリガタイプごとのCPUクォータについてのドキュメントはありません」と言いますが、「ApplicationTrigger」などの使用時間が長いこともわかります。それはなぜ文書化されていないのですか?それはdocuenetedされていないので、あなたはどのように知っていますか? – GradientByte

関連する問題