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 求解答
{
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 求解答
解决方案 »
- 求C#代码:点击Enter键 触发按钮事件
- 这样子的日历控件怎么做? 很急。
- 正则表达式判断字符串是否回文数
- a=500,b=200,在不考虑第三方变量的情况下交换两个值
- 完全复制数据库结构的疑问~先谢谢各位大侠!小弟初来不知如何孝敬各位,就选了50分.
- 请教高手为什么用adapter的update方法不能更新数据库?
- C# winform 程序 如何屏蔽组合键如:ctrl+N ,shift+F10 ,F5 等组合键。急急......在线等
- ~~哪里有“VS.NET2003英文版”的下载~~!
- 求助:c#中如何镜像pictureBox?
- 超简单问题,请指教
- 关于如果预览图片的问题
- webBrowser 调用 Refresh 方法时不会发生 DocumentCompleted 事件?
//这里用锁的机制,提高并发控制能力
lock (SequenceLock)
{
o.vBatchID = GetBatchID();
} 在处理数据的时候加了
//这里用锁的机制,提高并发控制能力
lock (SequenceLock)
{
o.vBatchID = GetBatchID();
}看到楼主写的如上代码,你这样加锁是不起作用的,因为每次都是一个新的对象
楼主应对线程的共有资源加锁