使用 await 如何使代碼執行緒安全?
鏈接:https : //docs.microsoft.com/en-us/ef/core/dbcontext-configuration/#avoiding-dbcontext-threading-issues
Entity Framework Core 不支持在同一個 DbContext 實體上運行多個并行操作。這包括異步查詢的并行執行和來自多個執行緒的任何顯式并發使用。因此,請始終立即等待異步呼叫,或者為并行執行的操作使用單獨的 DbContext 實體。
說 1 db 呼叫正在進行中,執行緒 1 正在進行中。當它在其中作業時;
情況1:
假設我沒有使用異步。另一個執行緒進行并行呼叫,因此會有沖突和錯誤。
案例二:
假設我使用異步。另一個執行緒進行并行呼叫:
案例2.a:由于我們使用異步,當第一個執行緒發出請求并等待回應時,它將釋放執行緒,因此執行緒2在發出請求時不會發生沖突。我明白這一點。
案例 2.b 如果兩個執行緒真的同時發出請求怎么辦。
案例 2.b 是否可能,在這里使用 async 有幫助嗎?
uj5u.com熱心網友回復:
“總是立即等待異步呼叫”意味著避免啟動多個異步操作并等待它們稍后完成(就像對多個 HTTP 請求所做的那樣)。
這是一個典型的例子,說明應該對異步 HTTP 呼叫做什么,但對 EF 操作無效:
// start operations early so results are there after our CPU intensive code complete
var task1 = dbContext.GetSomething();
var task2 = dbContext.GetMore();
// do something slow here to let both operations to finish
var result1 = await task1;
// even more code
var result2 = await task2;
此代碼將使兩個操作并行運行,從而可能導致 dbContext 出現問題。
該指南建議:
var result1 = await dbContext.GetSomething();
var result2 = await dbContext.GetMore();
// run slow code now sequntially to avoid parallel calls to dbContext.
事實上,如果你小心的話,你可以對 DBContext 的呼叫和對不相關物件的其他操作進行類似的交錯 - 即 HTTP 呼叫和 DBContext 并行呼叫,或者 DBContext 呼叫和 CPU 密集型代碼與awiatEF 呼叫的后期并行運行。
請注意,該指南對在兩個執行緒之間共享背景關系沒有多大幫助 - 與任何非執行緒安全物件一樣,您有責任防止同時訪問此類共享物件。
uj5u.com熱心網友回復:
您缺少的是,在 ASP.NET Core 的常見情況下,DbContext 的范圍僅限于 HTTP 請求,并且框架保證在任何時候只有一個中間件或控制器方法為請求運行。因此await,異步呼叫足以防止并行 DbContext 訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/409448.html
標籤:
