首页 新闻 赞助 找找看

多线程执行到一定程度,console程序就没反应了

0
悬赏园豆:20 [已解决问题] 解决于 2012-06-28 17:18

目前环境是这样
第三方有数据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();
}

roboth的主页 roboth | 初学一级 | 园豆:28
提问于:2012-05-25 10:30
< >
分享
最佳答案
0

entity framework 处理有事务,是不是没提交而影响其他的线程等待.你最好贴全部代码

收获园豆:20
56180825 | 小虾三级 |园豆:1756 | 2012-05-25 11:04

using (ERPContext _db = new ERPContext()) {
_db.Erp_B.Add(item);
_db.SaveChanges();
return true;
}

 

这里没用到事务啊?

roboth | 园豆:28 (初学一级) | 2012-05-25 11:13

@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 | 园豆:1756 (小虾三级) | 2012-05-25 11:22

@56180825: 

ef能不能设置不用事务提交的方式呢?

roboth | 园豆:28 (初学一级) | 2012-05-25 12:13

@roboth: 

如果savechange报错,是不是事务会回滚?

roboth | 园豆:28 (初学一级) | 2012-05-25 12:44

@roboth: 会回滚的.你还是表用多线程了,处理起来反而吃力

56180825 | 园豆:1756 (小虾三级) | 2012-05-25 12:47

@56180825: 

多用户访问一个页面的时候,ef面临的情况不是一样的吗?

roboth | 园豆:28 (初学一级) | 2012-05-25 12:55

@roboth: 我错了,貌是微软的东西很牛X,LINQ2SQL中将我创建所有线程的操作居然合并成一个事务.不存在线程问题,

56180825 | 园豆:1756 (小虾三级) | 2012-05-25 13:35
其他回答(2)
0

線程 開的太多了。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-25 10:34

三个线程多吗?

瓶颈是不是db io上?

每次add8个表?是这个造成的吗?

entity framework对于多线程有什么注意事项,每次using(context)可以吗?

支持(0) 反对(0) roboth | 园豆:28 (初学一级) | 2012-05-25 10:37

@roboth: 哦。是3個。應該對多線程 支持沒有什麽問題。你想web用這個,不就是多線程嗎?

是不是有事務,鎖定

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-25 11:10

@無限遐想: 

再生成流水号时,用到一个lock

支持(0) 反对(0) roboth | 园豆:28 (初学一级) | 2012-05-25 11:15

@roboth: 那 可能是lock的問題。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-05-25 11:17

@無限遐想: 我暂时用guid代替,去掉lock,尝试一下。

支持(0) 反对(0) roboth | 园豆:28 (初学一级) | 2012-05-25 12:12

@roboth: 

不是这lock的问题。目前去掉,console也停止。

支持(0) 反对(0) roboth | 园豆:28 (初学一级) | 2012-05-25 12:27
0

每个线程只处理属于一个表的数据,然后,分成8个线程来处理,这样可能会好一点。

sinhbv | 园豆:2579 (老鸟四级) | 2012-05-25 13:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册