APM 以極少執行緒處理大量 I/O 密集工作、不阻塞任何執行緒,是高回應/可擴展應用關鍵。但實作困難:
try/catch/finally, lock, using, 迴圈等無法拆分。yield return 產生序列,編譯器生成狀態機,可暫停/恢復執行,支援完整控制流結構。
private static void SynchronousPattern() {
using (FileStream fs = new FileStream(typeof(ApmPatterns).Assembly.Location,
FileMode.Open, FileAccess.Read, FileShare.Read, 8192, FileOptions.Asynchronous)) {
Byte[] data = new Byte[fs.Length];
Int32 bytesRead = fs.Read(data, 0, data.Length);
ProcessData(data);
}
}
using 確保資源釋放。後續將展示如何用上述三特性漸進簡化非同步寫法。