You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# EF调用异步存储过程方法未等待执行完成就提前返回问题求助

问题原因
  • 调用异步方法RemoveAllCurrentEntries时未添加await关键字,此时你拿到的deleteEntries是还在执行中的Task<int>对象,而非方法执行完成后的返回值,程序自然不会等待任务执行完成再走后续逻辑。
  • 你写的deleteEntries == Task.CompletedTask判断逻辑完全不成立:RemoveAllCurrentEntries返回的是带整型返回值的泛型Task<int>,和无返回值的Task.CompletedTask永远不可能相等,代码会直接走到else分支,此时调用deleteEntries.Result时任务还未执行完成,就会抛出你看到的WaitingForActivation状态提示。
  • 额外提示:你代码中WebnPortalEntities拼写疑似错误,和RemoveAllCurrentEntries方法中的WebPortalEntities相比多了一个字母n,请注意排查。
修正方案

将ExecutePriceFile方法中调用删除逻辑的部分改为加await等待执行完成,同时将后续的SaveChanges改为异步版本匹配整体异步逻辑,修正后的代码如下:

private async Task ExecutePriceFile()
{
  try
  {
    var pricefile = Path.Combine(
      Settings.Default.PriceFileDirectory,
      Settings.Default.PriceFileName);

    // 校验文件是否存在,不存在则终止后续逻辑
    if (!File.Exists(pricefile)) return;

    var parsedfile = ParsePriceFile(pricefile);

    if (!parsedfile.Any()) return;

    // 此处修正了疑似拼写错误的WebnPortalEntities,你可以根据实际类名调整
    using (var ent = new WebPortalEntities())
    {
      // 加await等待异步删除方法执行完成,拿到返回的数据库影响行数
      var deleteAffectedRows = await RemoveAllCurrentEntries();

      // 只要删除方法没有抛异常就说明执行成功,你也可以根据业务需要判断影响行数是否符合预期
      foreach (var priceFile in parsedfile)
      {
        var pf = new CustomerPrice();
        pf.CorporationId = Settings.Default.CorporationId;
        pf.CustomerPriceId = Guid.NewGuid();

        pf.AccountNumber = priceFile.AccountNumber;
        pf.BranchNumber = priceFile.BranchNumber;
        pf.BudgetBalance = priceFile.BudgetBalance;
        pf.BudgetRate = priceFile.BudgetRate;
        pf.ContractDepositQuantity = priceFile.ContractDepositQuantity;
        pf.ContractGasPercent = priceFile.ContractGasPercent;
        pf.ContractGasQuantity = priceFile.ContractGasQuantity;
        pf.ContractGasTenths = priceFile.ContractGasTenths;
        pf.CreditLimit = priceFile.CreditLimit;
        pf.CurrentDate = priceFile.CurrentDate;
        pf.CurrentDiscountDays = priceFile.CurrentDiscountDays;
        pf.CurrentDiscountRate = priceFile.CurrentDiscountRate;
        //pf.CurrentDiscountRate2 = columns[22].ToDecimal();
        pf.CurrentDiscountRateDays = priceFile.CurrentDiscountRateDays;
        pf.CurrentDiscountRateType = priceFile.CurrentDiscountType;
        pf.CurrentDiscountType = priceFile.CurrentDiscountType;
        // pf.CurrentPrice2 = columns[19];
        pf.CurrentPrice = priceFile.CurrentPrice;
        pf.LastPaymentDate = priceFile.LastPaymentDate;
        pf.NonBudgetBalance = priceFile.NonBudgetBalance;
        pf.OldestDiscountDays = priceFile.OldestDiscountDays;
        pf.OldestDiscountRate = priceFile.OldestDiscountRate;
        pf.OldestDiscountType = priceFile.OldestDiscountType;
        pf.OldestPrice = priceFile.OldestPrice;
        pf.PastDueBalance = priceFile.PastDueBalance;
        pf.PaymentAmount = priceFile.PaymentAmount;
        pf.PreviousDate = priceFile.PreviousDate;
        pf.PreviousDiscountDays = priceFile.PreviousDiscountDays;
        pf.PreviousDiscountRate = priceFile.PreviousDiscountRate;
        pf.PreviousDiscountType = priceFile.PreviousDiscountType;
        pf.PreviousPrice = priceFile.PreviousPrice;
        pf.ProductCode = priceFile.ProductCode;
        pf.IsActive = priceFile.Status.ToActive();
        pf.UnitOfIssue = priceFile.UnitOfIssue;
        ent.CustomerPrices.Add(pf);
      }
      // 使用异步保存方法加await,匹配整体异步逻辑
      await ent.SaveChangesAsync();
    }
  }
  catch (Exception exception)
  {
    Console.WriteLine(exception);
    throw;
  }
}

内容的提问来源于stack exchange,提问作者ErocM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 09:48:04