[英]ASP.NET Core Task.WhenAll - A second operation started on this context before a previous operation completed
[英]Upgraded EF Core to 3.1 and got compilation error for Task.WhenAll
在我們的項目中,我們使用了 EF Core 2.2.6。 但是升級到 EF Core 3.1 后,下面這段代碼停止編譯並報錯
var offerTask = DbContext.Offers.FindAsync(offerId);
var priceTask = DbContext.VendorPrices
.Where(x => x.OfferId == offerId && ...)
.ToListAsync(cancellationToken);
await Task.WhenAll(offerTask, priceTask);
錯誤 CS1503
參數 1:無法從 'System.Threading.Tasks.ValueTask' 轉換為 'System.Threading.Tasks.Task'
我發現在新版本的 EF Core 中, FindAsync
方法返回ValueTask
(盡管在舊版本中它返回Task
),這導致了編譯錯誤。
這個問題的解決方法是什么? 我應該只使用.AsTask()
嗎?
為什么
此更改減少了調用這些方法時發生的堆分配數量,從而提高了總體性能。 只是等待上述 API 的應用程序只需要重新編譯。
緩解措施
僅等待上述 API 的應用程序只需要重新編譯 - 無需更改源代碼。 更復雜的用法(例如,將返回的
Task
傳遞給Task.WhenAny()
)通常需要通過調用AsTask()
將返回的ValueTask<T>
轉換為Task<T>
。 請注意,這否定了此更改帶來的分配減少。
解決方案:
await Task.WhenAll(offerTask, priceTask).AsTask();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.