// procedural
foreach (var foo in bar)
{
foo.someProperty = getData(ref foo);
}
// threaded
foreach (var foo in bar)
{
ThreadStart work = delegate
{
getData(ref foo);
};
new Thread(work).Start();
}
getData(ref foo){
// Either a LINQ query
// Or Exec Command to Stored procedure in SQL Server
// Either taking approx 2 seconds to return results
foo.someProperty = resultsFromDBOrLinqStatement;
}
如果 bar 有 20 个项目,那么简单地使用程序 foreach 循环大约需要 10 秒 - 一个接一个地执行一个请求,每次调用数据库。
如果对于相同的数据,使用每个循环的线程,请求需要更长的时间?!看起来即使线程都很好,对数据库的请求 - 来自每个线程 - 正在阻止事情。
如果我将 getData() 方法修改为;
getData(ref foo){
thread.sleep(4000);
}
然后,正如预期的那样,整个请求在 4 秒内完成 - 所有线程几乎同时启动,并在 4 秒后同时退出。
我是否缺少与每个线程中的 DB 调用相关的东西,从而减慢了整个过程的速度?- 一些 web.config 设置用于与 DB 等的并发连接?
PS。我尝试过并行foreach和Tasks,但它总是回到线程与数据库调用减慢速度,就好像数据库服务器正在排队所有调用一样。