多线程 - 代码跳过

时间:2016-01-08 16:30:51

标签: c#

我在

上遇到了问题
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并停止。任何想法为什么会这样?

2 个答案:

答案 0 :(得分:3)

await异步方法(并且它实际上是异步执行)时,结果是立即return。这就是await的工作原理 - 这就是为什么它返回Task<bool>而不仅仅是bool - 你没有得到价值,只是一个承诺未来某个时候的价值。也许

这当然会使调试变得有点棘手。当您在调试器中逐行执行时,您实际上是在执行线程,而不是执行任务。当异步操作实际完成时,该方法的其余部分将在稍后执行 - 但是到那时,调用者线程已经消失,或者它正在做一些不同的事情。如果你实际在await _db.SaveChangesAsync();之后的行上放置一个断点,它将像往常一样被击中(当然,除非操作抛出异常)。

您的问题最有可能是调用您的异步方法的代码 - 特别是在某些时候,您忘记执行await SomeAsync()而不是SomeAsync()。这完全解开了异步操作链,并且丢失了任何未处理的异常以及返回值。

答案 1 :(得分:-1)

最好的猜测是,因为您使用的是client.Id在模型分配中而不是您刚刚保存的newClient,所以会抛出异常。此时客户端仍为空。