我有以下代码:
// 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
吗?
所以,为什么这个await
语句返回的是一个Task
呢?
感谢您的帮助。
Task<T>
或Task
。Select本身不关心返回类型,因此它会投影一个可枚举的Task,因为您的选择lambda是异步的。您可以遍历集合并等待Stream。 - vcsjonesvoid
,则您将不知道异步任务何时完成,也无法获取任何结果(因为没有结果)。只有当它是事件处理程序时,您才真正希望拥有void
异步方法,但这不是。 - Servyasync
方法返回void
并将其转换为async
方法时,应该将其返回类型从void
更改为Task
,因为Task
是调用者知道它何时完成的一种方式,但表示它没有结果。返回void
只意味着调用者甚至无法知道何时完成。 - Servyreturn await
语句会返回一个Task
呢?简单来说,await
关键字将Task<T>
解封成T
,而async
关键字会将T
封装回Task<T>
。我赞同 Servy 的回答。 - Stephen Cleary