如何返回异步 IEnumerable<string>?

Cod*_*dey 2 c#

我有以下方法:

public async IEnumerable<string> GetListDriversAsync()
{
   var drives = await graphClient.Drive.Root.Children.Request().GetAsync();
        foreach (var d in drives)
            yield return d.ToString(); 
}
Run Code Online (Sandbox Code Playgroud)

但是编译器错误说:

“async 的返回类型必须是 void、Task 或 Task <T>

当方法为异步时如何返回 IEnumerable?

Eni*_*ity 5

尝试这个:

public async Task<IEnumerable<string>> GetListDriversAsync()
{
    var drives = await graphClient.Drive.Root.Children.Request().GetAsync();

    IEnumerable<string> GetListDrivers()
    {
        foreach (var d in drives)
            yield return d.ToString();
    }

    return GetListDrivers();
}
Run Code Online (Sandbox Code Playgroud)

  • 只是为了我自己的理解 - 为什么在这种情况下使用本地函数和“yield return”而不是“return drivers.Select(d =&gt; d.ToString())”? (2认同)

smo*_*nes 5

C# 8 中可以使用另一种方法。它使用IAsyncEnumerable

public async IAsyncEnumerable<string> GetListDriversAsync()
{
    var drives = await graphClient.Drive.Root.Children.Request().GetAsync();
    foreach (var d in drives)
        yield return d.ToString();
}
Run Code Online (Sandbox Code Playgroud)

它会稍微改变您的签名,这可能(也可能不是)适合您。

用法:

await foreach (var driver in foo.GetListDriversAsync())
{
    Console.WriteLine(driver );
}
Run Code Online (Sandbox Code Playgroud)