我一直在尝试在现有应用程序中添加并行的foreach并遇到一个奇怪的问题
应用架构
BO层
private IUserService _userService;
public BOUser(IUserService userService) => _userService=userService;
public void AddUser(User user) => _userService.addUser(user);
服务层
private IUnitofWork _uow;
private IUserRepository _userRepo;
UserService(IUOW _uow, IUserRepository _userRepo)
{
uow = _uow;
_userRepo.uow = _uow;
}
public void AddUser (User user) {
_uow.BeginTransaction();
_userRepo.Add(user);
_uow.CommitTransaction();
}
回购层
public IUnitOfWork UnitOfWork { get; set; }
public void Add(user){
UnitOfWork.Connection.Insert<UserContact>(userContact, UnitOfWork.Transaction);
}
工作单元
public UnitOfWork(IDbConnection connection)
{
Connection = connection; // responsible for creating new connection
}
到今天为止,这个方法还不错,但是当我尝试在BO层中使用parallel.foreach添加多个用户时,我遇到了一次失败,一次成功
当BO层启动且UOW.connection在整个过程中保持为1时,将启动服务层 当我尝试多个线程时,因为连接是多个线程之间共享的一个对象 它失败,因为一个线程完成了工作并关闭了Connection对象
我想出了解决方案,方法是从构造函数中删除UOW并使用将是
的服务位置模式IUserSrevice userService = new UserService();
将基于线程创建多个连接对象。
它不是礼仪的方式。任何专家的意见都会有所帮助
答案 0 :(得分:0)
cur_node.next=new_node
不是线程安全的对象,因为其想法是创建一个连接对象池,并让每个线程从该池借用连接,完成其工作,并在完成后将其返回到池中。
一次最多只能有一个线程访问一个连接对象。
您应该注入连接池而不是单个连接对象。