我在.NET 4.0中的工作和我的代碼應該這樣做:使用Parallel.ForEach和Tasks.Factory.StartNew數據庫插入/更新用
我有暴露給用戶的WebAPI。在這我有一個對象的集合。基本上是一個包含一些對象的ConcurrentBag。我必須迭代該集合中的每個對象,然後在數據庫中插入/更新其數據。對象的數量可以很高(200-300)。除此之外,如果可以有多個使用我的API的併發用戶。
現在,插入/更新用是作爲康涅狄格州的數據庫,這使得這個過程非常緩慢的做出每一個記錄很慢。不幸的是我不能改變這個邏輯。
爲了提高我使用的,而不是常規的foreach Parallel.ForEach因爲每個迭代不同勢性能。另外,我在db
這裏創建每次插入一個單獨的任務是我的代碼
var tasks = new List<Task>(allRecordings.Count);//Creating a Task List
Parallel.ForEach(allRecordings, recording =>
{
var recordingItem = recording;
//Lines oF Code
//
if (some Conditions){
var task = Task.Factory.StartNew(
() => SaveRecordingDetailsToDb(ref recordingItem, device.Locale));
recording.Title = recordingItem.Title;
recording.ProgramId =recordingItem.ProgramId;
recording.SeriesId = recordingItem.SeriesId;
tasks.Add(task);//Adding Task to List
}
});
Task.WaitAll(tasks.ToArray()); //Waiting for all Tasks to complete before going back to main
Function
}
可以MemoryLeak當有消費這一相同的API 另外多個併發請求發生在上述區塊,將使用Parallel.ForEach比普通的ForEach更好。
「作爲康涅狄格州的數據庫,這使得這個過程非常緩慢的做出每個記錄」 - 這聽起來不太可能,如果你要使用正規ADO.NET的主要數據庫;自動連接池通常支持開箱即用。目前正在採取什麼樣的時間?我不確定''Parallel.ForEach'在這裏可以幫助你(它甚至可能是積極無用的,即使它變得更糟) –
所以這裏發生的是當SaveRecordingDetailsToDb被調用時,首先它從MongoDB中檢索一些信息,然後執行在MS SQL Server中存儲過程。這是一個遺留代碼:( –
好吧,它的SQL Server部分應該支持連接池。我不能評論mongo。回到問題:你有*理由*認爲它可能導致某種泄漏? –