Windows 8.1 之異步編程
使用 Windows 8.1 Preview 中新的計(jì)劃程序 API,你可以設(shè)置任務(wù)的優(yōu)先級(jí)并管理作業(yè)。這樣有助于你以更高效方式編寫使用系統(tǒng)資源的應(yīng)用并為用戶提供響應(yīng)更快的體驗(yàn)。
編寫響應(yīng)性極高的應(yīng)用很有挑戰(zhàn)性。 你可以組合使用多種復(fù)雜的 UI 元素,包括 ListView 控件、SemanticZoom 控件和自定義控件,這些元素均會(huì)競(jìng)爭(zhēng)系統(tǒng)資源。 很多元素既需要—動(dòng)畫—等即時(shí)的前臺(tái)工作,也需要其他后臺(tái)工作。
對(duì)于 Windows 8 和 Windows Library for JavaScript 1.0,并沒有單一的集成式計(jì)劃程序。有時(shí)低優(yōu)先級(jí)的后臺(tái)任務(wù)可能會(huì)先于前臺(tái)工作占用到資源,致使應(yīng)用的行為出現(xiàn)響應(yīng)不良或遲鈍。 由于工作是在不同的隊(duì)列中計(jì)劃的,因此若要在不同隊(duì)列之間進(jìn)行協(xié)調(diào)來獲得所需的優(yōu)先級(jí),并沒有比較容易的方法。
Windows 8.1 Preview 和 Windows Library for JavaScript 2.0 Preview 引入了 Scheduler,這是一個(gè)對(duì)象/命名空間,它可以將所有工作隊(duì)列合并成單一的通用隊(duì)列。該新隊(duì)列采用基于優(yōu)先級(jí)的計(jì)劃策略,該策略可支持應(yīng)用快速、流暢地運(yùn)行,并幫助實(shí)現(xiàn)更統(tǒng)一的開發(fā)者體驗(yàn)。 你可以輕松地計(jì)劃任務(wù),分配優(yōu)先級(jí),從而達(dá)到在適當(dāng)時(shí)間完成適當(dāng)工作的目的。
Scheduler 可協(xié)調(diào) Windows Library for JavaScript 執(zhí)行的工作,并劃分 Windows Runtime 執(zhí)行的異步工作的優(yōu)先級(jí)。使用計(jì)劃程序,可讓你的應(yīng)用在系統(tǒng)中使用與所有其他工作相對(duì)的正確優(yōu)先級(jí)按計(jì)劃工作。
計(jì)劃作業(yè)
若要計(jì)劃工作,你需要使用 schedule 方法創(chuàng)建一個(gè)作業(yè)。向此方法傳遞一個(gè)函數(shù),用于執(zhí)行你想要完成的任務(wù)。你還可以為作業(yè)指定優(yōu)先級(jí)。schedule 方法返回一個(gè)實(shí)現(xiàn) IJob 接口的對(duì)象,你可以使用此對(duì)象對(duì)所計(jì)劃的作業(yè)執(zhí)行暫停、繼續(xù)和取消操作。
此處是在普通優(yōu)先級(jí)計(jì)劃兩個(gè)簡(jiǎn)單作業(yè)的示例。
- // 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");
若要了解完整代碼,請(qǐng)參閱計(jì)劃程序示例。
如需額外控制,你的工作函數(shù)還可以接受 IJobInfo 對(duì)象。你可以使用此對(duì)象來確定作業(yè)是否應(yīng)生成控制,計(jì)劃在當(dāng)前作業(yè)完成后應(yīng)運(yùn)行的第二個(gè)應(yīng)用,以及指定在作業(yè)生成控制的情況下應(yīng)運(yùn)行的函數(shù)。
管理作業(yè)
前一部分提到了你可以使用 schedule 返回的 IJob 對(duì)象來暫停、取消及繼續(xù)作業(yè)。你還可以使用 Scheduler 對(duì)象的 createOwnerToken 方法來獲取 IOwnerToken,然后使用它來控制其擁有的任何 IJob 對(duì)象。
此示例創(chuàng)建了若干 IOwnerToken 對(duì)象,然后使用它們來設(shè)置若干 IJob 對(duì)象的 owner 屬性。然后示例使用 IOwnerToken 來同時(shí)取消多個(gè)作業(yè)。
- 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();
原文鏈接:http://msdn.microsoft.com/zh-cn/library/windows/apps/bg182877.aspx