簡體   English   中英

將 EF Core 升級到 3.1 並得到 Task.WhenAll 的編譯錯誤

[英]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()嗎?

Ef core 3.1 重大變化

為什么

此更改減少了調用這些方法時發生的堆分配數量,從而提高了總體性能。 只是等待上述 API 的應用程序只需要重新編譯。

緩解措施

僅等待上述 API 的應用程序只需要重新編譯 - 無需更改源代碼。 更復雜的用法(例如,將返回的Task傳遞給Task.WhenAny() )通常需要通過調用AsTask()將返回的ValueTask<T>轉換為Task<T> 請注意,這否定了此更改帶來的分配減少。

解決方案:

await Task.WhenAll(offerTask, priceTask).AsTask();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM