これが私の意味です:
public Task<SomeObject> GetSomeObjectByTokenAsync(int id)
{
string token = repository.GetTokenById(id);
if (string.IsNullOrEmpty(token))
{
return Task.FromResult(new SomeObject()
{
IsAuthorized = false
});
}
else
{
return repository.GetSomeObjectByTokenAsync(token).ContinueWith(t =>
{
t.Result.IsAuthorized = true;
return t.Result;
});
}
}
上記の方法は待つことができますが、T askベースのA同期P atternが提案することとよく似ていると思いますか?(私が知っている他のパターンはAPMおよびEAPパターンです。)
では、次のコードはどうでしょう。
public async Task<SomeObject> GetSomeObjectByToken(int id)
{
string token = repository.GetTokenById(id);
if (string.IsNullOrEmpty(token))
{
return new SomeObject()
{
IsAuthorized = false
};
}
else
{
SomeObject result = await repository.GetSomeObjectByTokenAsync(token);
result.IsAuthorized = true;
return result;
}
}
主な違いはここに方法があるということですasync
、それは利用しawait
たキーワードを-ので、以前に書かれた方法とは対照的に、この変更を何?私もそれができることを知っています-待ってください。Taskを返すメソッドはすべて、私が間違っていない限り、そのことについてはできます。
メソッドがとラベル付けされているときはいつでも、これらのswitchステートメントで作成されたステートマシンをasync
認識しawait
ています。また、それ自体はスレッドを使用しないことを認識しています。スレッドはまったくブロックされません。上記のコードの実行を継続するためにコールバックされました。
しかし、await
キーワードを使用して呼び出す場合、2つのメソッドの根本的な違いは何ですか?何か違いはありますか、そしてある場合、どちらが好ましいですか?
編集:私は最初のコードスニペットが好まれているように感じます、何の影響もなく、非同期/待機キーワードを効果的に除外するためです-同期して実行を継続するタスク、またはホットパスですでに完了したタスク(キャッシュされます)。
result.IsAuthorized = true
は、はスレッドプールで実行されますが、2番目の例では、呼び出されたのと同じスレッドで実行されますGetSomeObjectByToken
(SynchronizationContext
UIスレッドなどがインストールされている場合)。GetSomeObjectByTokenAsync
例外をスローした場合の動作も少し異なります。ほとんどの場合、より読みやすいので、一般にawait
が優先されContinueWith
ます。