web-dev-qa-db-ja.com

非同期メソッドでの待機とタスクの結果

次のことの違いは何ですか:

async Task<T> method(){
    var r = await dynamodb.GetItemAsync(...)
    return r.Item;
}

async Task<T> method(){
    var task = dynamodb.GetItemAsync(...)
    return task.Result.Item;
}

私の場合、何らかの理由で、2番目だけが機能します。最初のものは決して終わらないようです。

28
luis

awaitはタスクの結果を非同期にアンラップしますが、Resultを使用するだけではタスクが完了するまでブロックされます。

Jon Skeetのこの説明を参照してください。

41
Frank Fajardo

task.Result は、プロパティのgetアクセサーにアクセスし、非同期操作が完了するまで呼び出しスレッドをブロックします。 Wait method を呼び出すのと同じです。操作の結果が利用可能になると、保存され、Resultプロパティへの後続の呼び出しですぐに返されます。タスクの操作中に例外が発生した場合、またはタスクがキャンセルされた場合、Resultプロパティは値を返さないことに注意してください。代わりに、プロパティ値にアクセスしようとすると、AggregateException例外がスローされます。唯一の違いは、待機がブロックされないことです。代わりに、タスクの完了を非同期で待機してから再開します

12
NASSER