目前环境是这样
第三方有数据80万
每次调第三方15条数据,分给三个线程,每个线程处理5条。
每条数据录入8个表(用的是entity framework 每次add都是using(contexnt_)
执行到一定程度,console程序就没反应了。
for (int i = 1; i <= iThreadCount; i++)
{
//参数化ThreadStart委托
workTicketThread = new Thread(new ParameterizedThreadStart(threadRun));
// Make this a background thread, so it will terminate when the main thread/process is de-activated
workTicketThread.IsBackground = false;
workTicketThread.SetApartmentState(ApartmentState.STA);
// Start the Work
List<Message> _task = tasks.FindAll(r => r.Group == i);
workTicketThread.Start(_task);
workerThreads[i - 1] = workTicketThread;
}
//可以对多线程 执行join方法,block主线程。等多线程执行完毕,在分块(perpage)调用接口
foreach (Thread t in workerThreads)
{
t.Join();
}
entity framework 处理有事务,是不是没提交而影响其他的线程等待.你最好贴全部代码
using (ERPContext _db = new ERPContext()) {
_db.Erp_B.Add(item);
_db.SaveChanges();
return true;
}
这里没用到事务啊?
@roboth: entity framework事务是默认的_db.SaveChanges();前的所有操作都在一个事务中.
你同时加入8个表,会有这样的可能,线程A,B,C,表1,2,3,4,5,6,7,8
A加入表1(包含事务锁定,等待提交),B加入表2(包含事务锁定,等待提交),,C加入表3(包含事务锁定,等待提交),
那A也要加入表2等待B提交事务,而B又等待A提交事务,这样就死锁了
@56180825:
ef能不能设置不用事务提交的方式呢?
@roboth:
如果savechange报错,是不是事务会回滚?
@roboth: 会回滚的.你还是表用多线程了,处理起来反而吃力
@56180825:
多用户访问一个页面的时候,ef面临的情况不是一样的吗?
@roboth: 我错了,貌是微软的东西很牛X,LINQ2SQL中将我创建所有线程的操作居然合并成一个事务.不存在线程问题,
線程 開的太多了。
三个线程多吗?
瓶颈是不是db io上?
每次add8个表?是这个造成的吗?
entity framework对于多线程有什么注意事项,每次using(context)可以吗?
@roboth: 哦。是3個。應該對多線程 支持沒有什麽問題。你想web用這個,不就是多線程嗎?
是不是有事務,鎖定
@無限遐想:
再生成流水号时,用到一个lock
@roboth: 那 可能是lock的問題。
@無限遐想: 我暂时用guid代替,去掉lock,尝试一下。
@roboth:
不是这lock的问题。目前去掉,console也停止。
每个线程只处理属于一个表的数据,然后,分成8个线程来处理,这样可能会好一点。