我正在處理現有的應用程序。這個應用程序從一個巨大的文件中讀取數據,然後在進行一些計算後將數據存儲在另一個表中。非常慢的foreach循環
但是這樣做的循環(見下文)需要很長時間。由於該文件有時包含1,000個記錄,因此整個過程需要數天。
我可以用其他東西替換這個foreach
循環嗎?我嘗試使用Parallel.ForEach
,它確實有幫助。我對此很陌生,所以感謝您的幫助。
foreach (record someredord Somereport.r)
{
try
{
using (var command = new SqlCommand("[procname]", sqlConn))
{
command.CommandTimeout = 0;
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(…);
IAsyncResult result = command.BeginExecuteReader();
while (!result.IsCompleted)
{
System.Threading.Thread.Sleep(10);
}
command.EndExecuteReader(result);
}
}
catch (Exception e)
{
…
}
}
審查應答後,我除去異步並用於編輯爲下面的代碼。但是這並沒有改善性能。
using (command = new SqlCommand("[sp]", sqlConn))
{
command.CommandTimeout = 0;
command.CommandType = CommandType.StoredProcedure;
foreach (record someRecord in someReport.)
{
command.Parameters.Clear();
command.Parameters.Add(....)
command.Prepare();
using (dr = command.ExecuteReader())
{
while (dr.Read())
{
if()
{
}
else if()
{
}
}
}
}
}
兩個想法 - 首先,你做的異步錯誤,因此你很可能會爲循環中的許多項目睡覺。其次,您是否可以在整個循環中重用SqlCommand對象,而不是每次都創建/銷燬一個對象? – n8wrl
如果您告訴我們更多關於您想要完成的內容,我們可能會向您展示SQL解決方案,該解決方案的運行速度提高了幾個數量級,並完全避免了整個異步/並行業務。 –
@ user1110790:您發佈的代碼充滿了錯誤(至少仍然有一個),所以我已經清理了一下。我可以虛心地建議,當你在SO上發佈信息時,請確保你的代碼是正確的;否則,你可能會得到許多關注於此的評論,而不是實際的問題。 – stakx