起因:今天要做一个定时器任务:五分钟查询一次数据库发现超时未支付的订单数据将其状态改为已经关闭(数据量大约100条的情况)
开始未使用异步:
public void SelfCloseGpPayOrders() { try { var list =db.GpPayOrders.Where(a => a.PaymentStatus == 0).ToList(); foreach (var item in list) { if(item.AddTime.AddHours(2) < DateTime.Now) { item.PaymentStatus = 4; item.Remark = "长时间未支付自行关闭订单"; db.Entry(item).State = EntityState.Modified; db.SaveChangesAsync(); NLogHelp.WriteInfo("长时间未支付自行关闭订单,订单支付号:"+item.MerOrderId); } } //return "success"; } catch (Exception) { //return e.InnerException.Message; } }
执行后发现每次更改两三次就不执行了,应该就是线程阻塞了,所以改成了异步
public async void SelfCloseGpPayOrders() { try { var list =await db.GpPayOrders.Where(a => a.PaymentStatus == 0).ToListAsync(); foreach (var item in list) { if(item.AddTime.AddHours(2) < DateTime.Now) { item.PaymentStatus = 4; item.Remark = "长时间未支付自行关闭订单"; db.Entry(item).State = EntityState.Modified; await db.SaveChangesAsync(); NLogHelp.WriteInfo("长时间未支付自行关闭订单,订单支付号:"+item.MerOrderId); } } //return "success"; } catch (Exception) { //return e.InnerException.Message; } }
修改之后。瞬间几百条数据更改完了,没有遗漏!
附录: