我在
上遇到了问题public async Task<bool> CreateNewClient(Client newClient) {
bool isCreated = false;
if (newClient != null) {
Client client = await GetClientByIdAsync(newClient.Id);
if (client == null) {
_db.ClientRepository.Add(newClient);
await _db.SaveChangesAsync();
var model = new RegisterCustomerModel() {
Username = client.Id,
Password = password
};
await RegisterToAuthorizeSystem(client.Id);
isCreated = true;
}
}
return isCreated;
}
在检查第9行的调试后,它停止工作,return true
,而不执行下一个语句。在SaveChangesAsync()
之后,它会继续创建model
并停止。任何想法为什么会这样?
答案 0 :(得分:3)
当await
异步方法(并且它实际上是异步执行)时,结果是立即return
。这就是await
的工作原理 - 这就是为什么它返回Task<bool>
而不仅仅是bool
- 你没有得到价值,只是一个承诺未来某个时候的价值。也许
这当然会使调试变得有点棘手。当您在调试器中逐行执行时,您实际上是在执行线程,而不是执行任务。当异步操作实际完成时,该方法的其余部分将在稍后执行 - 但是到那时,调用者线程已经消失,或者它正在做一些不同的事情。如果你实际在await _db.SaveChangesAsync();
之后的行上放置一个断点,它将像往常一样被击中(当然,除非操作抛出异常)。
您的问题最有可能是调用您的异步方法的代码 - 特别是在某些时候,您忘记执行await SomeAsync()
而不是SomeAsync()
。这完全解开了异步操作链,并且丢失了任何未处理的异常以及返回值。
答案 1 :(得分:-1)
最好的猜测是,因为您使用的是client.Id在模型分配中而不是您刚刚保存的newClient,所以会抛出异常。此时客户端仍为空。