標籤:private 延遲 建議 伸縮性 tar 系統 fast abi each
利用 async & await 進行非同步 IO 操作
可以使用非同步函數訪問檔案。使用非同步功能,可以調用非同步方法呼叫,而不使用回調或拆分您在多個方法或 lambda 運算式中的代碼。 若要使同步代碼非同步,則調用非同步方法呼叫而不是一個同步方法並添加幾個關鍵字到代碼中。
您可能認為添加的以下原因 asynchrony 到檔案訪問調用:
Asynchrony 建議於應用程式的響應能力更強。,因為是一個操作的 UI 線程可以執行其他工作。 如果 UI 線程必須執行需要很長時間的代碼(例如,超過 50 毫秒),UI 可以凍結,直到 I/O 完成的,並且使用介面執行緒可以重新處理鍵盤和滑鼠輸入和其他動作。
Asynchrony 通過減少對線程的需要增強 ASP.NET 和其他的延展性基於伺服器的應用程式。 如果應用程式使用專用線程上每個響應,並且一次兩個請求同時處理,則有線程是必需的。 在等待期間,非同步作業通常不需要使用線程。 它們簡要使用現有的 I/O 完成線程在末尾。
檔案訪問操作的延遲可能非常低在當前情況,但是,延遲在以後可能會大大提高。 例如,檔案可能會移至位於 the world 的伺服器。
添加的開銷使用非同步功能很小。
非同步任務可以並行輕鬆地運行。
對 FileStream 選件類的使用
本主題中的樣本使用 FileStream 選件類,它具有一個選項導致非同步 I/O 發生在作業系統層級。 使用此選項,您可以避免在許多情況下阻止線程池線程。 若要啟用此選項,則指定 useAsync=true 或在建構函式中 options=FileOptions.Asynchronous 參數調用。
不能對 StreamReader 和 StreamWriter 的此選項,如果直接通過指定檔案路徑開啟這些檔案。 但是,您可以使用此選項,則提供自己 FileStream選件類開啟的 Stream。 請注意,非同步呼叫是比在 UI app,即使線程池線程阻塞,在等待期間,因為使用介面執行緒未阻止。
編寫文本
下面的樣本寫入文本到檔案。 在每個請等待語句,則此方法會立即退出。 當檔案 I/O 完成時,方法以等待語句後面的語句。 請注意"修飾符在使用等待語句方法的定義。
1 /// <summary> 2 /// 非同步寫入檔案 3 /// </summary> 4 /// <returns></returns> 5 private async Task WriteTextAsync() 6 { 7 var path = $"temp.txt"; 8 var content = Guid.NewGuid().ToString(); 9 10 using (var fs = new FileStream(path,11 FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, bufferSize: 4096, useAsync: true))12 {13 var buffer = Encoding.UTF8.GetBytes(content);14 15 //var writeTask = fs.WriteAsync(buffer, 0, buffer.Length);16 //await writeTask;17 await fs.WriteAsync(buffer, 0, buffer.Length);18 }19 }
行號 17 的語句可以修改為:
1 //await fs.WriteAsync(buffer, 0, buffer.Length);2 //可以改為3 var writeTask = fs.WriteAsync(buffer, 0, buffer.Length);4 await writeTask;
第一個語句(行號 1)返回任務並導致進程的檔案。 使用等待的第二個語句(行號3、4)導致方法立即退出並返回其他任務。 當隨後處理的檔案完成時,執行回 await 的語句。
[.NET] 利用 async & await 進行非同步 IO 操作(整理中...)