19

我有以下代码:

            // 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(); });

我希望streams是 typeIEnumerable<Stream>但实际上它是 of IEnumberable<Task<Stream>>,如果我省略了 await 关键字,这是我所期望的。的返回类型OpenStreamForWriteAsyncTask<Stream>——当然等待它应该产生一个Stream

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

谢谢你的帮助。

4

2 回答 2

16

所有async方法都返回voidTaskTask<TResult>。lambda 只是一个匿名方法,因此仍然适用。它本质上与这个命名方法相同:

private static async Task<Stream> Foo(TypeGOesHere f )
{
    return await f.OpenStreamForWriteAsync(); 
}

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

private static Stream Foo(TypeGOesHere f )
{
    return f.OpenStreamForWriteAsync().Result; 
}

你可能不想要那个。

如果对您有帮助,您可以使用以下方法将您的IEnumerable<Task<Stream>>变成一个:Task<Stream[]>Task.WhenAll

Task<Stream[]> resultTask = Task.WhenAll(streams);
于 2012-12-20T23:42:43.980 回答
3

这不是最好的解决方案吗?

        // 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 and await the Task that waits for all tasks to complete? maybe thats whats being implied above...
    var streams = await Task.WhenAll(files.Select(async f => { return await f.OpenStreamForWriteAsync(); }));
于 2016-12-13T12:29:21.210 回答