原由:今天要作一個定時器任務:五分鐘查詢一次數據庫發現超時未支付的訂單數據將其狀態改成已經關閉(數據量大約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