需要從oracle下載大量數據(每日),然後刪除sql server上的數據(重新運行的情況下),然後將數據粘貼到帶有sqlbulk副本的sql server中。非平行版本:加速通過並行.for
for (int i = 0; i < curves.Rows.Count; i++)
{
//download data from oracle
var data = GetCurve(connectString, impdate, curves.Rows[i]);
//delete old data in sql server
DeleteSQL(DateTime.Now, curves.Rows[i]);
//write to sql server with sqlbulk.copy
writeCurve(data, "dbo.t_Curves");
}
我想加快使用parallel for,但顯然這些步驟是相互依賴的。這是我想出來的(我以前從未使用任務工廠):
Parallel.For(0, curves.Rows.Count, i =>
{
var taskLoad = Task.Factory.StartNew(() => GetCurve(connectString, impdate, curves.Rows[i]));
var taskDelete = Task.Factory.StartNew(() => DeleteSQL(impdate, curves.Rows[i]));
taskDelete.Wait();
taskLoad.Wait();
var taskWrite = Task.Factory.StartNew(() => writeCurve(taskLoad.Result, "dbo.t_Curves"));
});
這大概減半了時間。我可以期待的時間減半了嗎?這是線程的正確使用嗎?這是我能做的嗎?我可以加入任何進一步的加速嗎?
UPDATE
只是爲了信息,曲線是定義一個DataTable和我不是寫或逐行讀取任何行。
或者我應該寫這樣的:
Parallel.For(0, curves.Rows.Count, i =>
{
var taskLoad = Task.Factory.StartNew(() => GetCurve(connectString, impdate, curves.Rows[i]));
var taskDelete = Task.Factory.StartNew(() => DeleteSQL(impdate, curves.Rows[i]));
var res1 = await taskDelete;
var res2 = await taskLoad;
writeCurve(res2, "dbo.t_Curves");
});
@Silvermind:不,我希望它儘可能快,我真的不知道我是否正確使用了taks工廠,我從未使用過它(我猜數字只是表示加速,也許減半時間是我能期待的嗎?) – nik
我不認爲你需要爲寫作部分啓動一項任務,因爲你只是希望它在加載和刪除任務完成後運行。 – juharr
@juharr:好點,這很有道理 – nik