示例#1
0
        SP_RESULT StartAsync(Func <SP_RESULT> func)
        {
            SP_RESULT result   = null;
            var       perOrder = (APIRquestModel)OrderInfo.Clone();
            var       task     = new Task(() =>
            {
                if (IsEnd)
                {
                    Thread.Sleep(10);
                }
                try
                {
                    result = DoAsyncGetSpCmd(perOrder, func);
                }
                catch (Exception e)
                {
                    WriteLog(e.ToString());
                }
                finally
                {
                    lock (this)
                    {
                        if (IsEnd)
                        {
                            IsAsync = false;
                            FlushLog();
                        }
                    }
                }
            });

            task.Start();
            if (IsEnd)
            {
                WriteLog("非用户请求数据");
                return(null);
            }
            if (task.Wait(TimeToAsyc))
            {//正常输出结果
                return(result);
            }
            lock (this)
            {
                if (task.IsCompleted)
                {
                    return(result);
                }
                this.EndTime = DateTime.Now;
                this.IsEnd   = true;
                IsAsync      = true;
#if TDEBUG
                WriteLog("async start step=" + Step);
#endif
                AddSOneFlag();
            }

            return(new SP_RESULT());
        }
示例#2
0
        /// <summary>
        /// 错误码映射
        /// </summary>
        /// <param name="json"></param>
        private API_ERROR ResultStatusMap(SP_RESULT rlt)
        {
            if (rlt == null || Step < 2)
            {
                return(rlt.status);
            }

            if (rlt.status == API_ERROR.STEP2_OK)
            {
                return(rlt.status);
            }

            if (rlt.status == API_ERROR.OK)
            {
                return(API_ERROR.STEP2_OK);
            }

            if ((int)rlt.status >= 2000)
            {
                return(rlt.status);
            }

            return(rlt.status + 1000);
        }
示例#3
0
        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);
        }
示例#4
0
        /// <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();
            }
        }