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

时间:2012-12-20 23:34:15

标签: c# windows-runtime async-await

我有以下代码:

            // 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属于IEnumerable<Stream>类型,但实际上它是IEnumberable<Task<Stream>>,这是我在省略await关键字时所期望的。 OpenStreamForWriteAsync的返回类型为Task<Stream> - 肯定等待它应生成Stream

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:10)

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

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

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

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

你可能不希望这样。

如果可以帮助您,可以使用IEnumerable<Task<Stream>>Task<Stream[]>变成Task.WhenAll

Task<Stream[]> resultTask = Task.WhenAll(streams);

答案 1 :(得分:1)

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

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