// 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 秒かかります。リクエストを次々に実行し、毎回 DB を呼び出します。
同じデータに対して、スレッド化された for each ループが使用されると、リクエストに時間がかかりますか?! スレッドがすべて問題なくても、各スレッドからの DB への要求が滞っているように見えます。
getData() メソッドを次のように変更すると、
getData(ref foo){
thread.sleep(4000);
}
次に、予想どおり、リクエスト全体が 4 秒で完了します。すべてのスレッドがほぼ同時に起動し、同時に実行され、4 秒後に終了します。
このプロセス全体を遅くしている各スレッドの DB 呼び出しに関して何か不足していますか? - DB などへの同時接続のための web.config 設定はありますか?
PS。並列 foreach と Tasks を試しましたが、データベース サーバーがすべての呼び出しをキューに入れているかのように、常にデータベース呼び出しでスレッド化に戻り、速度が低下します。