WinJS スケジューリング

Windows 8.1 の新しいスケジューラ API を使うと、タスクの優先順位を設定してジョブを管理できます。システム リソースを効率的に使う HTML5 アプリを作成して、応答性の高いユーザー エクスペリエンスを提供するのに役立ちます。

常に応答性の高いアプリを記述するのは困難です。 ListView コントロール、SemanticZoom コントロール、カスタム コントロールなど (すべてシステム リソースに関して競合します)、複数の複雑な UI 要素を組み合わせることができます。 多くの要素には、即時フォアグラウンド作業 (アニメーションなど) と他のバックグラウンド作業の両方が必要です。

Windows 8 と JavaScript 1.0 用 Windows ライブラリには、統合された単一のスケジューラがありませんでした。優先度の低いバックグラウンド タスクがフォアグラウンド作業より優先され、応答性が下がったり、アプリの動作に引っかかりが発生することがありました。 作業は複数のキューでスケジュールされていたため、キュー間で調整して必要な優先順位付けを行う簡単な方法がありませんでした。

Windows 8.1 と JavaScript 2.0 用 Windows ライブラリには、すべての作業キューを単一の共通キューに統合するオブジェクト/名前空間である Scheduler が導入されています。この新しいキューには、高速で滑らかなアプリと統一感の増した開発者エクスペリエンスをサポートする、優先順位ベースのスケジュール ポリシーがあります。 適切な作業が適切なタイミングで実行されるように、簡単にタスクをスケジュールして優先順位を割り当てることができます。

Scheduler は、JavaScript 用 Windows ライブラリにより実行される作業と、Windows ランタイムにより実行される優先的な非同期作業を調整します。スケジューラを使うと、システム内の他のすべての作業に対して、アプリの作業を適切な優先順位でスケジュールできます。

ジョブのスケジュール

作業をスケジュールするには、schedule メソッドを使ってジョブを作成します。目的のタスクを実行する関数にこのメソッドを渡します。ジョブの優先順位を指定することもできます。schedule メソッドは、IJob インターフェイスを実装するオブジェクトを返すため、このオブジェクトを使うことで、スケジュールしたジョブの一時停止、再開、取り消しを行うことができます。

通常の優先順位で 2 つの単純なジョブをスケジュールする例を次に示します。

// Schedule some work.
var job1 = S.schedule(function () {
    window.output("Running job1");
}, S.Priority.normal);
window.output("Scheduled job1");

// Schedule more work.
var job2 = S.schedule(function () {
    window.output("Running job2");
}, S.Priority.normal);
window.output("Scheduled job2");

完全なコードについては、スケジューラのサンプルに関するページをご覧ください。

その他のコントロールの場合、処理関数は IJobInfo オブジェクトを受け入れることができます。このオブジェクトを使って、ジョブよりコントロールが生成されるかどうかの判断、現在のジョブの完了後に実行する 2 番目のジョブのスケジュール、ジョブによりコントロールが生成された場合に実行する関数の指定を行うことができます。

ジョブの管理

前のセクションでは、schedule メソッドによって返される IJob オブジェクトを使って、ジョブの一時停止、取り消し、再開を行うことができることを説明しました。さらに、Scheduler オブジェクトの createOwnerToken メソッドを使って IOwnerToken を取得し、このトークンを使って所有される IJob オブジェクトを制御することもできます。

この例では、複数の IOwnerToken オブジェクトを作成し、それらのオブジェクトを使って、複数の IJob オブジェクトの owner のプロパティを設定します。次に、IOwnerToken を使って複数のジョブを一度に取り消します。

var ownerObject1 = S.createOwnerToken();
var ownerObject2 = S.createOwnerToken();
var ownerObject3 = S.createOwnerToken();

// Schedule some work.
var job1 = S.schedule(function () {
    window.output("Running job1 with owner1");
}, S.Priority.normal);
job1.owner = ownerObject1;
window.output("Scheduled job1 with owner1");

// Schedule some work.
var job2 = S.schedule(function () {
    window.output("Running job2 with owner2");
}, S.Priority.normal);
job2.owner = ownerObject2;
window.output("Scheduled job2 with owner2");

// Schedule some work.
var job3 = S.schedule(function () {
    window.output("Running job3 with owner1");
}, S.Priority.normal);
job3.owner = ownerObject1;
window.output("Scheduled job3 with owner1");

// Schedule some work.
var job4 = S.schedule(function () {
    window.output("Running job4 with owner3");
}, S.Priority.normal);
job4.owner = ownerObject3;
window.output("Scheduled job4 with owner3");

window.output("Canceling jobs with owner1");
ownerObject1.cancelAll();

完全なコードについては、スケジューラのサンプルに関するページをご覧ください。

生成とドレインを示す例など、その他の例については、スケジューラのサンプルに関するページをご覧ください。