【发布时间】:2016-12-13 20:29:21
【问题描述】:
我有以下代码:
// 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?
感谢您的帮助。
【问题讨论】:
-
异步方法总是返回
Task<T>或Task。 Select 本身并不关心返回类型。因此它会投射一个可枚举的任务,因为您选择的 lambda 是异步的。您可以遍历您的集合并等待 Stream。 -
好吧,我们可以编写一个“async void”方法,这就是我认为这里发生的事情。我该如何解决?
-
@MatthewH 如果是
void,您将不知道异步任务何时完成并且无法获得任何结果(因为不会有任何结果)。当它是一个事件处理程序时,你真的只想拥有一个voidasync 方法,但事实并非如此。 -
@MatthewH vscjones 可能的意思是,只要您有一个返回 void 的非
async方法并将其转换为async方法,您应该将其返回类型从void更改为Task,因为Task是调用者知道何时完成的一种方式,但表明它没有结果。返回void只是意味着调用者甚至不知道它何时结束。 -
why is the return await statement returning a Task?我 +1'ed Servy 的答案,但简单地说:await将Task<T>展开为T,async将T包裹回Task<T>.
标签: c# windows-runtime async-await