[英]Async lambda expression with await returns Task?
我有以下代碼:
// 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?
謝謝你的幫助。
所有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;
}
你可能不希望這樣。
您可以使用Task.WhenAll
將IEnumerable<Task<Stream>>
轉換為Task<Stream[]>
,如果這可以幫助您:
Task<Stream[]> resultTask = Task.WhenAll(streams);
這不是最好的解決方案嗎?
// 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(); }));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.