c# - await を持つ非同期ラムダ式は Task を返しますか?



windows-runtime async-await (2)

これが最善の解決策ではないでしょうか。

        // 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(); }));

次のようなコードがあります。

            // 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(); });

streamsIEnumerable<Stream>型であることを期待しstreamsが、実際にはIEnumberable<Task<Stream>>であり、これはawaitキーワードを省略した場合に期待されることです。 OpenStreamForWriteAsyncの戻り値の型はTask<Stream>です。確実に待ってからStreamを生成しStreamか?

では、なぜreturn awaitステートメントがTaskを返すのでしょうか。

ご協力いただきありがとうございます。


すべてのasyncメソッドは、 voidTask 、またはTask<TResult>返します。 ラムダは単なる匿名の方法なので、それでも適用されます。 それは本質的にこの名前付きメソッドと同じです:

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.WhenAllことができます。

Task<Stream[]> resultTask = Task.WhenAll(streams);




async-await