第一,你要知道,并行线程会有一个蛋疼的地方。他不会每次执行都给你去开一个线程。
我一开始以为每次执行都会去开一个新的线程。。。。
list.AsParallel().ForAll(memberInfo =>
{
Console.WriteLine(Thread.GetCurrentProcessorId());
}
result
这就导致,如果我们在当前线程上下文绑定了sessionFactory就会导致,重用线程会获取到一样的session
如果在前面一个线程中我们关闭了session 就会导致后来获取到的session失效。
第一个, 我们首先去配置 SessionFactory
NHibernate.Cfg.Configuration的实例化对象Configuration
设置SessionFactory的配置属性
Configuration.SetProperty("current_session_context_class", "thread_static"); //每个线程获取到的session是不一样的。
然后更改获取session的方法
当然要在方法外部设置一个静态的session 并且要带上线程静态的标签,那么每个线程获取的去获取的时候是原来的那一个,这就涉及到关闭了
[ThreadStatic] private static ISession Session; public ISession OpenCurrentSession() { try { if(CurrentSessionContext.HasBind(SessionFactory)) { Session = SessionFactory.GetCurrentSession(); } else { Session = SessionFactory.OpenSession(); CurrentSessionContext.Bind(Session); } return Session; } catch { throw; } }
关闭session方法
public void CloseCurrentSession() { try { //一定要线程上下文解绑 否则重用线程将会取到已经关闭的session CurrentSessionContext.Unbind(Session.SessionFactory); Session.Close(); Session.Dispose(); } catch { throw; } }
//至于查询方法 ,你可以把你的sessionFactory使用 单例,
然后重ioc容器中去取
list.AsParallel().ForAll(memberInfo => { Console.WriteLine(Thread.GetCurrentProcessorId()); var session = appSessionFactory.OpenCurrentSession(); //这里进行查询 我不建议在这里取使用更新删除插入操作,很容易出问题 appSessionFactory.CloseCurrentSession(); });
这个并行线程使用session 就差不多完了。
一般用于多个去做一件事的时候可以用到并行线程,比如我需要集合中的每个元素都要去查数据库,如果用for循环,会非常慢,如果用并行,将会非常快。