代码之家  ›  专栏  ›  技术社区  ›  Craig

尝试获取结果列表时出现等待/异步错误

  •  0
  • Craig  · 技术社区  · 6 年前

    var accountId = context.Account.OrderBy(x => x.LastUpdateDate).ThenBy(x=>x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
    var transactionLineId = context.TransactionLine.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.Transaction.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
    var transactionId = context.Transaction.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
    var budgetId = context.Budget.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
    var scheduleId = context.Schedule.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId).ExternalId;
    

    然后,等待每次重复并传递给一个方法。

    var guids = new List<Guid> { await accountId, await transactionLineId, await transactionId, await budgetId, await scheduleId };
    
    var checkGuid = MungeTwoGuids(guids);
    

    找不到“Task”类型的参数(是否缺少

    这发生在第一行。我想我可以把所有的选择。。。。一下子,基本上。。。然后等待所有的回应。而不是打电话,等等,打电话,等等。。。。

    这不是实现我想要做的事情的正确方法吗?不是的,因为我有一个错误,但是我对等待的理解是不是走错了方向?

    await accountId.Result.ExternalId,
    
    0 回复  |  直到 6 年前
        1
  •  5
  •   Stefan    6 年前

    你的 FirstOrDefaultAsync 返回一个 Task<T> ,不是 T 因此没有 ExternalId .

    通常有两种选择:

    • 选择 Select 然后等待任务,或者
    • 任务<T> 首先,结果将是 T型 ,包含您的属性以便您可以访问它。

    但是,正如@GSerg所指出的:第一种选择并不适用,因为 executing parralell queries will result in a concurrency exception .


    所以,在你的情况下,等待 FirstOrDefaultAsync 选择 , ?? 或者一个空检查来克服可能的空引用异常。


    尽量避免 accountId.Result.ExternalId 因为它会使代码同步运行,而且会失去异步调用的好处。请参见: What is the difference between await Task<T> and Task<T>.Result?

        2
  •  2
  •   Johan Donne    6 年前

    您应该这样更改代码:

     var accountId = context.Account.OrderBy(x => x.LastUpdateDate).ThenBy(x=>x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId);
     var transactionLineId = context.TransactionLine.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.Transaction.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId);
     var transactionId = context.Transaction.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId);
     var budgetId = context.Budget.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId);
     var scheduleId = context.Schedule.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId);
    
    
    var guids = new List<Guid> { 
              (await accountId).ExternalId,
              (await transactionLineId).ExternalId,
              (await transactionId).ExternalId,
              (await budgetId).Externalid,
              (await scheduleId).EternalId };
    
    var checkGuid = MungeTwoGuids(guids);
    

    :上面的更改将解决最初的问题,但正如GSerg在下面的注释中指出的,您将得到一个异常,因为EF不允许在同一上下文上同时执行异步操作。

    您可以通过以下方法解决此问题:

    a) 立即等待每项任务

    b) 如果您真的想要并行执行:为每个任务创建一个单独的上下文

        3
  •  0
  •   Binara Thambugala    6 年前

    请照下面的做。

    var accountId = (await context.Account.OrderBy(x => x.LastUpdateDate).ThenBy(x=>x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId)).ExternalId;
    var transactionLineId = (await context.TransactionLine.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.Transaction.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId)).ExternalId;
    var transactionId = (await context.Transaction.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId)).ExternalId;
    var budgetId = (await context.Budget.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.UserAccount.ExternalId == _jwt.HomeAccountId)).ExternalId;
    var scheduleId = (await context.Schedule.OrderBy(x => x.LastUpdateDate).ThenBy(x => x.LastUpdateDate).FirstOrDefaultAsync(x => x.CreditAccount.UserAccount.ExternalId == _jwt.HomeAccountId)).ExternalId
    

    var guids = new List<Guid> {accountId, transactionLineId, transactionId, budgetId, scheduleId};
    var checkGuid = MungeTwoGuids(guids);