WinRT のバックグラウンド タスクの CPU 使用率クォータは 1 秒、またはロック画面の場合は 2 秒です。問題は、この CPU 使用率を正確に測定する方法です。コードがこの 2 秒のクォータで実行されるかどうかを知りたいですか? タスクの実行前後に DateTime.Now だけを使用するのは正しいアプローチではないと思います。
バックグラウンド タスクに関する MSDN の記事: バックグラウンド タスク
によるアプリのサポート
2 に答える
私も同じ問題を抱えていました。
を起動するTask Manager
と、タブの下に、App history
さまざまなアプリによるリソース使用量の統計が表示されます。それらの1つはですCPU Time
。問題は、平均ではなく、合計 CPU 使用時間しか表示されないことです。
平均時間が必要な場合は、アプリでバックグラウンド アクティビティのカウントを保持し、全体の時間をそれで割ると、平均時間が得られます。
GetProcessTimes WinAPIを使用しました。
ドキュメントには「デスクトップ アプリのみ」と記載されていますが、技術的には、電話にも存在します。
[DllImport( "KERNELBASE.DLL", SetLastError = true )]
static extern IntPtr GetCurrentProcess();
// NB! Undocumented API, won't pass marketplace checks.
[DllImport( "KERNELBASE.DLL", SetLastError = true )]
[return: MarshalAs( UnmanagedType.Bool )]
static extern bool GetProcessTimes( IntPtr hProcess, out long lpCreationTime, out long lpExitTime, out long lpKernelTime, out long lpUserTime );
PC で KERNELBASE.DLL を Kernel32.dll に置き換えます。
これはマーケットプレイスの認定には合格しませんが、バックグラウンド タスクのベンチマークを行うには十分なはずです。
開始時に GetProcessTimes を呼び出し、 calculate long startTime = KernelTime + UserTime
。終了したら GetProcessTimes を呼び出し、 calculate( KernelTime + UserTime ) - startTime
を実行すると、データが取得されます。測定単位は、TimeSpan と同様に 100ns ティックです。