非同步程式設計
這個主題描述通用 Windows 平台 (UWP) 的非同步程式設計,以及它在 C#、Microsoft Visual Basic .NET、C++ 以及 JavaScript 中的表示方式。
使用非同步程式設計可以幫助您的應用程式在執行可能需要較長時間的工作時保持回應。 例如,從網際網路下載內容的應用程式可能會花費幾秒鐘的時間來等待內容到達。 如果您在 UI 執行緒上使用同步方法來擷取內容,則應用程式將會阻塞,直到該方法傳回。 該應用程式不會回應使用者互動,並且由於它似乎沒有回應,使用者可能會感到沮喪。 更好的方法是使用非同步程式設計,讓應用程式在等待作業完成時繼續執行並回應 UI。
對於可能需要很長時間才能完成的方法,非同步程式設計是 UWP 中常用的做法,而不是例外狀況。 JavaScript、C#、Visual Basic 和 C++ 都提供對非同步方法的語言支援。
UWP 中的非同步程式設計
許多 UWP 功能 (例如 MediaCapture API 和 StorageFile API) 都以非同步 API 公開。 按照慣例,非同步 API 的名稱以「Async」結尾,表示它們的部分執行可能在控制項傳回給呼叫者之後發生。
當您在通用 Windows 平台 (UWP) 應用程式中使用非同步 API 時,您的程式碼會以一致的方式進行非阻塞呼叫。 當您在自己的 API 定義中實作這些非同步模式時,呼叫者能以可預測的方式理解和使用您的程式碼。
以下是一些需要呼叫非同步 Windows 執行階段 API 的常見工作。
顯示訊息對話方塊
使用檔案系統,顯示檔案選擇器
向網際網路傳送資料和從網際網路接收資料
使用通訊端、串流、連線性
處理約會、連絡人、行事曆
處理文件類型,例如開啟可攜式文件格式 (PDF) 檔案或解碼影像或媒體格式
與裝置或服務互動
使用 UWP 非同步模式,您也許能夠完全避免明確管理執行緒。 每種程式語言都以自己的方式支援 UWP 的非同步模式:
程式設計語言 | 非同步表示法 |
---|---|
C# | async 關鍵字、await 運算子 |
Visual Basic | Async 關鍵字、Await 運算子 |
C++/WinRT | 協同程式和 co_await 運算子 |
C++/CX | task 類別,.then 方法 |
JavaScript | promise 物件,then 函式 |
使用 C# 和 Visual Basic 的 UWP 非同步模式
用 C# 或 Visual Basic 撰寫的典型程式碼片段是同步執行的,這表示當一行執行時,它會在下一行執行之前完成。 先前有用於非同步執行的 Microsoft .NET 程式設計模型,但產生的程式碼往往強調執行非同步程式碼的機制,而不是專注於程式碼試圖完成的工作。 UWP、.NET Framework 和 C# 和 Visual Basic 編譯器已新增功能,以將非同步機制從程式碼中抽象化。 對於 .NET 和 UWP,您可以撰寫非同步程式碼,專注於程式碼的用途,而不是其執行方式和時機。 您的非同步程式碼看起來會與同步程式碼相當相似。 如需詳細資訊,請參閱在 C# 或 Visual Basic 中呼叫非同步 API。
使用 C++/WinRT 的 UWP 非同步模式
使用 C++/WinRT 時,您可以使用協同程式和 co_await 運算子。 如需詳細資訊和程式碼範例,請參閱 C++/WinRT 中的非同步程式設計。
使用 C++/CX 的 UWP 非同步模式
在 C++/CX 中,非同步程式設計是以工作類別及其 then 方法為基礎。 語法與 JavaScript Promise 類似。 工作類別及其相關類型還提供取消和管理執行緒內容的功能。 如需詳細資訊,請參閱C++/CX 非同步程式設計。
create_async 函式支援產生非同步 API,這些非同步 API 可以透過 JavaScript 或支援 UWP 的任何其他語言使用。 如需詳細資訊,請參閱 使用 C++/CX 建立非同步作業。
使用 JavaScript 的 UWP 非同步模式
在 JavaScript 中,非同步程式設計遵循 Common JS Promises/A 提議的標準,讓非同步方法傳回 Promise 物件。 UWP 和 Windows Library for JavaScript 中都使用了 Promise。
Promise 物件代表將來將實現的值。 在 UWP 中,您可以從工作站函式取得 Promise 物件,按照慣例,該物件的名稱會以「Async」結尾。
在多數情況下,呼叫非同步函式幾乎與呼叫傳統函式一樣簡單。 不同之處在於,您使用 then 或 done 方法來指派結果或錯誤的處理常式,並啟動作業。