使用await的异步lambda表达式返回Task?

Mat*_*w H 16 c# async-await windows-runtime

我有以下代码:

            // Get all of the files from the local storage directory.
        var files = await folder.GetFilesAsync();

        // Map each file to a stream corresponding to that file.
        var streams = files.Select(async f => { return await f.OpenStreamForWriteAsync(); });
Run Code Online (Sandbox Code Playgroud)

我希望它是streams类型的,IEnumerable<Stream>但事实上它是IEnumberable<Task<Stream>>,这是我所期望的,如果我省略了await关键字.返回类型OpenStreamForWriteAsyncTask<Stream>- 肯定等待它应该产生一个Stream

那么,为什么return await语句返回一个Task?

谢谢你的帮助.

Ser*_*rvy 12

所有的async方法都返回要么void,TaskTask<TResult>.lambda只是一个匿名方法,因此仍然适用.它与这个命名方法基本相同:

private static async Task<Stream> Foo(TypeGOesHere f )
{
    return await f.OpenStreamForWriteAsync(); 
}
Run Code Online (Sandbox Code Playgroud)

为了使它返回a,Stream它需要是一个阻塞方法,而不是异步方法:

private static Stream Foo(TypeGOesHere f )
{
    return f.OpenStreamForWriteAsync().Result; 
}
Run Code Online (Sandbox Code Playgroud)

你可能不希望这样.

你可以把你IEnumerable<Task<Stream>>变成一个Task<Stream[]>使用Task.WhenAll是否有帮助你:

Task<Stream[]> resultTask = Task.WhenAll(streams);
Run Code Online (Sandbox Code Playgroud)