我有一個使用 yield 回傳 IAsyncEnumerable 的異步方法。在某些情況下,可能需要同步獲取專案,因此我想為此創建另一種方法,通過同步運行現有方法回傳 IEnumerable 以避免重復代碼。
async IAsyncEnumerable<Foo> GetItemsAsync()
{
yield return ...
}
IEnumerable<Foo> GetItems() => GetItemsAsync() // Run shyncronously
我閱讀了大量有關使用 Task.RunSynchronously 或簡單地在同步背景關系中呼叫它并忽略警告之類的技術同步運行異步方法的解決方案。但是,在異步列舉的情況下,這兩種方法似乎都不可能。該介面沒有 RunSynchronously 方法,并且嘗試使用未等待的 foreach 列舉它會導致編譯錯誤。獲取列舉器并同步運行 MoveNext 似乎也不是一個選項,因為該方法回傳 ValueTask,它不具有 Wait 方法,我需要捕獲任務的結果以了解何時停止迭代。
那么是否可以同步強制我的異步列舉器方法并將結果作為 IEnumerable,如果是這樣,如何?
uj5u.com熱心網友回復:
您可以使用System.Linq.Async包中的ToEnumerable擴展方法。這個方法的簽名是:
public static IEnumerable<TSource> ToEnumerable<TSource>(
this IAsyncEnumerable<TSource> source)
...你可以這樣使用它:
IEnumerable<Foo> GetItems() => GetItemsAsync().ToEnumerable();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389185.html
