【发布时间】:2016-05-23 11:09:31
【问题描述】:
我问了一个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 Profiler 输出,除了您看到的
insert命令之外,还有哪些“不可见”操作? -
是的。我的表有主键。无论有没有异步和/或并行执行,都需要大约 4 秒。我也使用了代码优先的方法。
-
在任何这些 sn-ps 中都没有并行数据库访问。所有这些 sn-ps 都做同样的事情 - 同步调用
SaveChanges。
标签: c# sql-server ef-code-first async-await task-parallel-library