19

次のコードがあります。

            // 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>が、実際には of ですIEnumberable<Task<Stream>>。これは、 await キーワードを省略した場合に予想していたものです。の戻り値の型OpenStreamForWriteAsyncTask<Stream>— 確かにそれを待っているとStream?を生成するはずです。

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

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

4

2 に答える 2

16

すべてのasyncメソッドは、、、またはのいずれかvoidを返します。ラムダは単なる匿名メソッドであるため、それは引き続き適用されます。これは、次の名前付きメソッドと本質的に同じです。TaskTask<TResult>

private static async Task<Stream> Foo(TypeGOesHere f )
{
    return await f.OpenStreamForWriteAsync(); 
}

を返すようにするにStreamは、非同期メソッドではなく、ブロッキング メソッドである必要があります。

private static Stream Foo(TypeGOesHere f )
{
    return f.OpenStreamForWriteAsync().Result; 
}

あなたはおそらくそれを望んでいません。

if it を使用しIEnumerable<Task<Stream>>て、あなたを に変えることができます:Task<Stream[]>Task.WhenAll

Task<Stream[]> resultTask = Task.WhenAll(streams);
于 2012-12-20T23:42:43.980 に答える
3

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

        // 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(); }));
于 2016-12-13T12:29:21.210 に答える