private void StartAsyncTask(Object workItemState)
        {
            Thread oThread = new Thread(new ThreadStart(this.StartBuss));
            oThread.Start();
        }        private void StartBuss() {
            log.Info(string.Format("Completion IsThreadPoolThread is {0}", Thread.CurrentThread.IsThreadPoolThread));            NameValueCollection coll = _context.Request.Form;
            if (coll.Count == 0)
                coll = _context.Request.QueryString;            string strResponse = string.Empty;
            string strUserID = string.Empty;
            List<string> batchid = new List<string>();
            string tradeno = string.Empty;            //验证参数
            CheckSign check = new CheckSign();
            if (check.SignCheckAsy(coll, ref strResponse, ref strUserID))
            {
                //处理交易
                strResponse = businessprocess.ProcessBusiness(coll, strUserID, ref batchid, ref tradeno);
            }            log.Info(strResponse);
            Encoding encode = Encoding.Default;
            string charset = coll.Get("_input_charset");
            if (!string.IsNullOrEmpty(charset))
                encode = Encoding.GetEncoding(charset);
            _context.Response.ContentEncoding = encode;
            _context.Response.Write(strResponse);
            _completed = true;
            _callback(this);
        }
public string ProcessBusiness(NameValueCollection coll, string strUserid, ref List<string> batchid, ref string tradeno)
        {
            string strResposne = string.Empty;            BusinessParam IParam = IModelFactory.CreateInterface(coll);            if (IParam != null)
            {
                //记录日志
                log.Info(
                        string.Format("开始交易请求",
                        ObjectToString.Ots(IParam))
                );
                IParam.userid = strUserid;
                IBusinessInterface IbusinessInterface = IFactory.IFactory.CreateInterface(IParam.service);
                if (IbusinessInterface != null)
                {
                    strResposne = IbusinessInterface.BussinessProcess(IParam, ref batchid, ref tradeno);
                }
            }
            else
            {
                strResposne = EnumDescription.GetFieldText(ResultInfo.INFO.INVALID_SERVICE);
            }
            return strResposne;
        } /// <summary>
        /// 创建流水单
        /// </summary>
        /// <param name="o">流水单实体</param>
        /// <returns></returns>
        public List<VirTrade> CreateTrade(List<VirTrade> VirTrade)
        {
            VirTrade o = null;
            string sql_value = "";
            List<SqlParameter> param = new List<SqlParameter>();
            try
            {
                for (int i = 0; i < VirTrade.Count; i++)
                {
                    o = VirTrade[i];
                    object SequenceLock = new object();
                    //这里用锁的机制,提高并发控制能力
                    lock (SequenceLock)
                    {
                        o.vBatchID = GetBatchID();
                    }                    ILog log = new ILog(typeof(TradeDAL));
                    log.Info(o.vBatchID + "_ vCustomer:" + o.vCustomer + "_ vCost:" + o.vCost);
                    if (!string.IsNullOrEmpty(o.vBatchID))
                    {
                        if (string.IsNullOrEmpty(o.vTradeNo))
                        {
                            o.vTradeNo = o.vBatchID + DateTime.Now.Millisecond.ToString();  //不带交易号 则新增交易号                          
                        }
                    }
                    else
                    {
                        throw new Exception("创建订单号失败!");
                    }
                    sql_value += string.Format(SQL_CREATE_VIR_TRADE, "(@vBatchID" + i + ",@vOrderID" + i + ",@vCost" + i + ",@vCostC" + i + ",@vCostN" + i + ",@vCDate" + i + ",@vODate" + i + ",@vTradeType" + i + ",@vTradeChannel" + i + ",@vTradePaymethod" + i + ",@vTradeState" + i + ",@vTradeNo" + i + ",@vPartner" + i + ",@vCustomer" + i + ",@vSeller" + i + ",@vTargetCustomer" + i + ",@vTargetSeller" + i + ",@vBody" + i + ");", "(@vBatchID" + i + ",@vTradeDetail" + i + ");");
                    param.Add(new SqlParameter("@vTradeDetail" + i, o.vTradeDetail.ToString().Replace('|', ' ')));
                    param.Add(new SqlParameter("@vBatchID" + i, o.vBatchID.ToString()));
                    param.Add(new SqlParameter("@vOrderID" + i, o.vOrderID.ToString()));
                    param.Add(new SqlParameter("@vCost" + i, o.vCost.ToString()));
                    param.Add(new SqlParameter("@vCostC" + i, o.vCostC.ToString()));
                    param.Add(new SqlParameter("@vCostN" + i, o.vCostN.ToString()));
                    param.Add(new SqlParameter("@vCDate" + i, DateTime.Now.ToString()));
                    param.Add(new SqlParameter("@vODate" + i, DateTime.Now.ToString()));
                    param.Add(new SqlParameter("@vTradeType" + i, o.vTradeType.ToString()));
                    param.Add(new SqlParameter("@vTradeChannel" + i, o.vTradeChannel.ToString()));
                    param.Add(new SqlParameter("@vTradeState" + i, o.vTradeState.ToString()));
                    param.Add(new SqlParameter("@vTradeNo" + i, o.vTradeNo.ToString()));
                    param.Add(new SqlParameter("@vPartner" + i, o.vPartner.ToString()));
                    param.Add(new SqlParameter("@vCustomer" + i, o.vCustomer.ToString()));
                    param.Add(new SqlParameter("@vTradePaymethod" + i, o.vTradePaymethod.ToString()));
                    param.Add(new SqlParameter("@vSeller" + i, o.vSeller.ToString()));
                    param.Add(new SqlParameter("@vTargetCustomer" + i, o.vTargetCustomer.ToString()));
                    param.Add(new SqlParameter("@vTargetSeller" + i, o.vTargetSeller.ToString()));
                    param.Add(new SqlParameter("@vBody" + i, o.vBody.ToString()));
                }
                SqlHelper.ExecuteNonQuery(AppConfig.JinRiVirtualAccountConn, CommandType.Text, sql_value, param.ToArray());                return VirTrade;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
并发状况下会出现                                EX:System.InvalidOperationException: 此 SqlTransaction 已完成;它再也无法使用。
   在 com.jinri.DAL.TradeDAL.CreateTrade(List`1 VirTrade) 位置 E:\code\VirtualAccount\VirtualAccount\com.jinri.DAL\TradeDAL\TradeDAL.cs:行号 135
   在 com.jinri.BLL.TradeBLL.CreateTrade(List`1 VirTrade) 位置 E:\code\VirtualAccount\VirtualAccount\com.jinri.BLL\TradeBLL\TradeBLL.cs:行号 28  求解答

解决方案 »

  1.   

    比如一个线程已经处理完事物,而另一个线程还要处理,那就出错了,所以你要做好同步,最起码你得加个lock吧
      

  2.   

    object SequenceLock = new object();
      //这里用锁的机制,提高并发控制能力
      lock (SequenceLock)
      {
      o.vBatchID = GetBatchID();
      } 在处理数据的时候加了
      

  3.   

     object SequenceLock = new object();
      //这里用锁的机制,提高并发控制能力
      lock (SequenceLock)
      {
      o.vBatchID = GetBatchID();
      }看到楼主写的如上代码,你这样加锁是不起作用的,因为每次都是一个新的对象
    楼主应对线程的共有资源加锁
      

  4.   

    问题已解决 呵呵 之前用的是ThreadPool的关系 NEW THREAD 就行了