原由:今天要作一个定时器任务:五分钟查询一次数据库发现超时未支付的订单数据将其状态改成已经关闭(数据量大约100条的状况)html
开始未使用异步:数据库
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; } }
修改以后。瞬间几百条数据更改完了,没有遗漏!异步
附录:async