2016-07-11 10 views
5

私が持っているクラスのインスタンスを構築するときに、トークン更新関数(asyncメソッド)を起動し、バックグラウンドで実行させたいと思います(返されたTaskへの参照を保持します)。すでに完了したタスクを待っているときはどうなりますか?

その後、ユーザーがリクエストをトリガーすると、私はそのことをお待ちしています。Task

Taskが1秒後に完了し、ユーザーが2秒後に要求をトリガーするとします(つまり、Taskが完了したことを意味します)。

ユーザーの要求awaitを処理する方法は、Taskの値をすぐに取得できますか?結局、Taskが完成し、値を保持します。

+3

はい、すぐに結果が返されます。 –

+0

@MatthewWatsonなぜあなたは答えとしてそれを書かなかったのですか?私はあなたの答えを受け入れるだろう。 – johni

+0

答えとして書くのに十分な長さではありませんでした。 –

答えて

6

ユーザーの要求を処理するメソッドは、タスクを待っています。すぐに値を取得しますか?

はい。 awaitタスクが既に完了している場合は、即座に戻ります。あなたは別のスレッドで数回それを待つことができますし、結果が出てきた(またはフォールトされている)だけ戻ってくるでしょう。

Task.CompletedTaskは、まさにこの理由のための機微として追加されました。 awaitこれは可能です。すでに完了しているので、すぐに成功したタスクを返します。

0

あなたはその結果を知っているでしょう。タスクが完了すると、resultプロパティに結果が格納され、保持されます。

1

あなたはTask.FromResultを使用して完了したタスク(値)を作成し、それを待つことができます。

var result = await Task.FromResult(5); 
Debug.Assert(result == 5); 

これは、キャッシュされたデータを返すことができる方法を持っている場合などに便利ですが、非同期的にフェッチする必要があります初めて。

はい、既に完了しているタスクを待つことができます。