非同步作業

優先使用非同步作業,而不要使用同步作業。

同步作業會在程式碼告知後立即執行,且程式碼須等待該同步作業完成之後,才能繼續進行。因此,這些作業會在影格迴圈的應用程式程式碼階段中執行。如果同步作業花費的時間太長,就會延伸影格迴圈的大小,這樣可能會導致顯示出現凍結或斷續現象。

當程式碼執行非同步作業時,程式碼並不需要立即執行該作業。目前執行緒中的程式碼與其他應用程式的程式碼可以繼續執行。執行階段接下來會盡快執行該作業,同時嘗試避免發生顯示問題。在某些情況下,執行會在背景中進行,且完全不會當做執行階段影格迴圈的一部分來執行。最後,當該作業完成時,執行階段就會傳送事件,而程式碼可偵聽該事件來執行進一步的工作。

您可以排程和分割非同步作業,避免發生顯示問題。因此,使用非同步作業較容易產生有回應的應用程式。如需詳細資訊,請參閱 認知效能與實際效能

不過,以非同步方式執行作業牽涉到額外的成本。非同步作業的實際執行時間可能會比較長,特別是那些只需要短時間即可完成的作業。

在執行階段中,許多作業無法改變其固有的同步或非同步本質,因此您無法選擇其執行方式。不過在 Adobe AIR 中,您可以選擇要以同步或非同步的方式來執行三種作業類型:

  • File 與 FileStream 類別作業

    File 類別的許多作業能以同步或非同步方式來執行。例如,複製或刪除檔案或目錄的方法,以及列出目錄內容的方法,這些方法全都有非同步版本。這些方法的非同步版本名稱,會加上「Async」字尾。例如,若要以非同步的方式刪除檔案,請呼叫 File.deleteFileAsync() 方法 (而不是 File.deleteFile() 方法)。

    使用 FileStream 物件來讀取或寫入檔案時,您開啟 FileStream 物件的方式會決定是否以非同步的方式來執行作業。使用 FileStream.openAsync() 方法進行非同步作業。資料寫入是以非同步方式來執行。資料讀取則是依區塊完成,因此一次可使用一部分資料。相較之下在同步模式中,FileStream 物件會先讀取整個檔案,然後才會繼續執行程式碼。

  • 本機 SQL 資料庫作業

    使用本機 SQL 資料庫時,會以同步或非同步模式來執行透過 SQLConnection 物件執行的所有作業。若要指定以非同步方式來執行作業,請使用 SQLConnection.openAsync() 方法來開啟資料庫連線,而不要使用 SQLConnection.open() 方法。以非同步方式執行資料庫作業時,會在背景執行這些作業。資料庫引擎完全不會在執行階段影格迴圈中執行,因此資料庫作業比較不可能造成顯示問題。

    如需改善本機 SQL 資料庫效能的其他策略,請參閱 SQL 資料庫效能

  • Pixel Bender 獨立著色器

    ShaderJob 類別可讓您透過 Pixel Bender 著色器來執行影像或一組資料,並存取原始的結果資料。根據預設,當您呼叫 ShaderJob.start() 方法時,著色器會以非同步方式執行。執行會在背景中進行,不會使用執行階段影格迴圈。若要強制 ShaderJob 物件以同步方式執行 (不建議這樣做),請將 true 值傳遞給 start() 方法的第一個參數。

除了以非同步方式執行程式碼的這些內建機制之外,您也可以將自己的程式碼建構為以非同步方式執行,而不以同步方式執行。如果您需要撰寫程式碼來執行冗長的工作,則您應該將程式碼建構成不同部分,並分別執行各個部分。您可以將程式碼分成幾個部分,讓執行階段可在程式碼執行區塊之間執行顯示作業,如此較不會出現顯示問題。

分割程式碼的數種技巧如下。這些技巧的主要原理是將程式碼撰寫成每次只執行部分工作。您會追蹤程式碼執行的工作,以及程式碼在何處停止執行。您可以使用像是 Timer 物件的機制來重複檢查工作是否仍在執行,並依區塊執行額外的工作,直到工作完成為止。

有數種已建立的樣式可供您使用,您可以藉此依上述方式建構分割工作的程式碼。下列文章與程式庫將說明這些樣式,並提供程式碼來協助您應用於應用程式中: