我問了一個question這是我如何更快地運行任務,但沒有任何答案適用於我。我有以下代碼將1500條記錄插入數據庫,但問題是需要大約4秒。我用async/await
,並行循環和AddRange
,我也保存更改自動檢測和驗證保存但沒有任何影響。我的代碼是這樣的:以更快的速度運行插入數據庫任務
async void button7_Click(object sender, EventArgs e)
{
var task = await Task.Run(() =>
{
Random rnd = new Random();
for (int i = 0; i <= 1500; i++)
{
db.Tbls.Add(new Tbl()
{
Name = "User" + i + 1,
Num = rnd.Next(10, i + 10)/10
});
}
db.SaveChanges();
return db.Tbls.Count();
});
}
而且具有的AddRange:
async void button7_Click(object sender, EventArgs e)
{
var task = await Task.Run(() =>
{
Random rnd = new Random();
var tbls = new List<Tbl>();
for (int i = 0; i <= 1500; i++)
{
tbls.Add(new Tbl()
{
Name = "User" + i + 1,
Num = rnd.Next(10, i + 10)/10
});
progress.Report(i * 100/1500);
}
db.Tbls.AddRange(tbls);
db.SaveChanges();
return db.Tbls.Count();
});
}
和帶有並行循環:
var task = await Task.Run(() =>
{
int seed = Environment.TickCount;
var random = new ThreadLocal<Random>(() => new Random(Interlocked.Increment(ref seed)));
var tbls = new ConcurrentBag<Tbl>();
Parallel.For(0, 1500, (i) => {
tbls.Add(new Tbl()
{
Name = "User" + i + 1,
Num = random.Value.Next(10, i + 10)/10
});
});
db.Tbls.AddRange(tbls);
db.SaveChanges();
return db.Tbls.Count();
});
有誰知道是什麼問題?
你的表是否有主鍵?在沒有任何異步和/或並行執行的情況下插入1500條記錄需要多少時間?看一下SQL事件探查器輸出,除了你看到的「insert」命令外,還有什麼「不可見」操作? – Arvo
是的。我的表有主鍵。有或者沒有異步和/或並行執行,大約需要4秒。我也使用代碼第一種方法。 –
這些片段中沒有任何並行數據庫訪問。所有這些片段都完全一樣 - 同步調用SaveChanges。 –