我有以下代码:
// 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?
感谢您的帮助。
答案 0 :(得分:10)
所有async
方法都会返回void
,Task
或Task<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(); }));