好的,听起来很奇怪,但是代码非常简单,可以很好地说明情况。
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
more越来越多地遇到这种模式。该模式由以下事件链组成:
- 等待初始呼叫,这会给我一些我需要处理的信息
- 同步处理该信息
- 等待最后的通话,以保存更新的工作
上面的代码块通常是我如何处理这些方法。我await
是第一个电话,我必须这样做,因为它是异步的。接下来,我要做的工作是不受IO或资源限制的,因此不是异步的。最后,我保存了我的工作,这也是一个async
电话,而不再是我的工作await
。
但这是处理这种模式的最有效/正确的方法吗?在我看来,我可以跳过await
上一个电话,但是如果失败了怎么办?我是否应该使用Task
诸如ContinueWith
将同步工作与原始调用链接在一起的方法?我现在只是不确定我是否正确处理了这一点。
给定示例中的代码,是否有更好的方法来处理此async / sync / async方法调用链?