场景:订单生成之后,许多后续操作使用Task.Factory.StartNew进行,例如调用,推荐人所推荐用户下单后,增加其计算优惠券推荐人数量。Task.Factory.StartNew偶尔抛出异常:System.InvalidOperationException: ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为已关闭。
原因:
1、Task.Factory.StartNew中调用的是创建订单线程Order_MainBLL类的属性this.DBSession,去执行业务。也就是使用了同一个数据库连接对象this.DbContext。
2、Task.Factory.StartNew创建了任务,在线程池空闲时,才会执行。任务开始时,原创建订单线程已经结束,关闭了数据库连接对象。
解决:
使用不同的数据库连接对象。
var _DBSession= new Order_MainBLL().DBSession;
try
{
_DBSession.IOrder_MainDAL.SetOrderSampleConfirmList(oid,isRepeat:1);
}
catch (Exception ex)
{
LogHelper.Instance.Error("余额支付后生成待确认出错:", ex);
}