簡體   English   中英

使用await的異步lambda表達式返回Task?

[英]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方法都返回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; 
}

你可能不希望這樣。

您可以使用Task.WhenAllIEnumerable<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM