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
相关产品推荐
相关产品推荐

