我的 ASP.NET Core 應用程式使用 Entity Framework Core。正如您所期望的那樣,控制器方法必須是異步的并呼叫 EF Core 的異步方法。
我還有需要讀取和寫入 excel 檔案的控制器方法。我正在使用 OpenXml。由于這些是 IO 操作,理想情況下它們將是異步操作,但 OpenXml 不提供任何異步方法。這是一個簡化的例子
private async Task<model> ReadFromExcel()
{
using var document = SpreadsheetDocument.Open("filePathAndName", false);
// read data into model
document.Close();
context.Models.Add(newModel);
await Context.SaveAsync();
return newModel;
}
另外,我需要先在一個檔案夾中找到該檔案,我也想將其設為異步。
Directory.EnumerateFiles("excelFolderName", ".xlsx");
根據本檔案ASP.NET Core Performance Best Practices我不應該使用 Task.Run 使同步 API 異步。我明白為什么,但是該規則是否適用于將阻塞執行緒潛力幾秒鐘的 IO 操作?我應該使這些 IO 操作異步嗎?如果是的話,使讀寫 excel 檔案和獲取檔案串列異步的基本方法是什么?
uj5u.com熱心網友回復:
由于這些是 IO 操作,理想情況下它們將是異步操作,但 OpenXml 不提供任何異步方法。
另外,我需要先在一個檔案夾中找到該檔案,我也想將其設為異步。
理想情況下,這些將是異步 API。但他們不是。使它們異步的方法是修復 API,而不是將其包裝在Task.Run. 您可以向 OpenXml 的維護者提出請求以獲取異步 API。檔案系統操作比較笨拙;這是 Win32 限制,而不是 BCL 限制,不太可能修復,但您可以詢問。
該規則是否適用于會阻塞執行緒幾秒鐘的 IO 操作?
是的。
無論請求是同步的還是異步的,請求都會被阻塞相同的時間。所以要考慮的是執行緒是如何被阻塞的。在理想的異步情況下,沒有執行緒被阻塞。由于您只有同步 API,因此您必須阻塞一個執行緒;直接呼叫 API 會阻塞一個執行緒池執行緒,將它推到Task.Run會阻塞另一個執行緒池執行緒——這是毫無意義的。
我應該使這些 IO 操作異步嗎?如果是的話,使讀寫 excel 檔案和獲取檔案串列異步的基本方法是什么?
你不能“讓他們異步”。您可以請求異步 API,然后暫時使用同步 API。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/533678.html
