さて、奇妙に聞こえますが、コードは非常にシンプルで、状況をうまく説明しています。
public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role)
{
AssertNotDisposed();
var roles = await GetRolesForUser(user);
roles.Roles = RemoveRoles(roles.Roles, role);
await Run(TableOperation.Replace(roles));
}
(私は以下の要約で話していることを知っていますが、上記は私がここで尋ねていることを実際に実行している実際の生産コードになるものからの実際の方法であり、実際にレビューすることに興味があります非同期/待機パターンに対する正確さのため)
async
/ を使用しているため、このパターンに頻繁に遭遇していawait
ます。このパターンは、次の一連のイベントで構成されています。
- 作業に必要な情報を取得する最初の電話を待つ
- その情報を同期的に処理する
- 更新された作業を保存する最後の呼び出しを待つ
通常、上記のコードブロックは、これらのメソッドの処理方法です。私await
は最初の呼び出しです。非同期であるためです。次に、IOまたはリソースにバインドされていないため、非同期ではない、必要な作業を実行します。最後に、私はまた、ある私の仕事、保存async
、および貨物カルトIのうち呼び出しawait
、それを。
しかし、これはこのパターンを処理する最も効率的で正しい方法ですか?私await
は最後の呼び出しをスキップすることができたようですが、それが失敗したらどうなりますか?また、同期作業を元の呼び出しと連鎖さTask
せるなどの方法を使用する必要がありContinueWith
ますか?私はちょうど今これを正しく処理しているかどうかわからない時点にいます。
例のコードを考えると、この非同期/同期/非同期メソッド呼び出しチェーンを処理するより良い方法はありますか?