private SP_RESULT DoAsyncGetSpCmd(APIRquestModel oldOrder, Func <SP_RESULT> func) { SP_RESULT result = null; try { result = func(); } catch (Exception e) { WriteLog(e.ToString()); SetError(API_ERROR.INNER_ERROR, e.Message); } lock (this) { if (!IsEnd) { return(result); } } FinalAsync(oldOrder, result); return(null); }
/// <summary> /// 异步数据保存 /// </summary> /// <param name="oldOrder"></param> /// <param name="result"></param> void FinalAsync(APIRquestModel oldOrder, SP_RESULT result) { //处理异步结果写入数据库 var ts = DateTime.Now - this.EndTime; if (ts.TotalSeconds < 1)//预留足够时间让前端系统处理数据 { var delay = ts.TotalMilliseconds > 500 ? 500 : 1000; #if TDEBUG WriteLog(string.Format("Delay {0}ms for main thread end", delay)); #endif Thread.Sleep(delay); } var ecode = result == null?this.GetError() : result.status; if (Step == 2) { if ((int)ecode != 1013 && (int)ecode != 1011) { ecode = (API_ERROR)((int)ecode + 1000); } else { ecode = API_ERROR.STEP2_OK; } } var tabName = string.Format("daily_log.tbl_api_order_{0:yyyyMM}", DateTime.Today); var sb = new StringBuilder(); var db = CreateDBase(); sb.AppendFormat("update {0} set ", tabName); if (ecode != API_ERROR.OK && ecode != API_ERROR.STEP2_OK) { sb.AppendFormat("`status`={0:d},", ecode); } if (oldOrder.spLinkId != OrderInfo.spLinkId) { sb.AppendFormat("`sp_linkid`='{0}',", db.SqlEncode(OrderInfo.spLinkId)); } if (oldOrder.apiExdata != OrderInfo.apiExdata) { sb.AppendFormat("`api_exdata`='{0}',", db.SqlEncode(OrderInfo.apiExdata)); } if (oldOrder.spExField != OrderInfo.spExField) { sb.AppendFormat("`sp_exField`='{0}',", db.SqlEncode(OrderInfo.spExField)); } var sql = sb.ToString(); if (sql.IndexOf("=") != -1) { sb.Length--; sb.AppendFormat(" where id={0}", OrderInfo.id); sql = sb.ToString(); } else { sb.Clear(); sql = null; } try { #if TDEBUG if (sb.Length > 10) { WriteLog("Async Execute sql:" + sql); } #endif if (!string.IsNullOrEmpty(sql)) { db.ExecuteNonQuery(sb.ToString()); } if (Step == 1) { sb.Clear(); sb.AppendFormat("select `cp_verifyCode` from {0} where id={1}", tabName, OrderInfo.id); sql = sb.ToString(); #if TDEBUG WriteLog("Async Execute sql:" + sql); #endif var vc = db.ExecuteScalar(sql); if (vc != null && !DBNull.Value.Equals(vc) && !string.IsNullOrEmpty((string)vc)) { OrderInfo.cpVerifyCode = (string)vc; } } } catch (Exception ex) { WriteLog(ex.ToString()); } finally { if (db is IDisposable) { ((IDisposable)db).Dispose(); } } IsAsync = false; #if TDEBUG WriteLog("async done! step=" + Step); #endif FlushLog(); RemoveSOneFlag(); if (Step == 1 && !string.IsNullOrEmpty(OrderInfo.cpVerifyCode)) { WriteLog("验证码已经上行,启动二次提交"); Step = 2; GetSpCmdStep2(); } }