【发布时间】:2015-07-27 10:59:44
【问题描述】:
我有以下正确使用 async/await 范例的代码。
internal static async Task AddReferencseData(ConfigurationDbContext context)
{
foreach (var sinkName in RequiredSinkTypeList)
{
var sinkType = new SinkType() { Name = sinkName };
context.SinkTypeCollection.Add(sinkType);
await context.SaveChangesAsync().ConfigureAwait(false);
}
}
如果我想使用 LINQ ForEach() 而不是使用 foreach(),那么写这个的等效方法是什么?例如,这个会给出编译错误。
internal static async Task AddReferenceData(ConfigurationDbContext context)
{
RequiredSinkTypeList.ForEach(
sinkName =>
{
var sinkType = new SinkType() { Name = sinkName };
context.SinkTypeCollection.Add(sinkType);
await context.SaveChangesAsync().ConfigureAwait(false);
});
}
唯一没有编译错误的代码就是这个。
internal static void AddReferenceData(ConfigurationDbContext context)
{
RequiredSinkTypeList.ForEach(
async sinkName =>
{
var sinkType = new SinkType() { Name = sinkName };
context.SinkTypeCollection.Add(sinkType);
await context.SaveChangesAsync().ConfigureAwait(false);
});
}
我担心这个方法没有异步签名,只有主体有。 这是我上面的第一个代码块的正确等价物吗?
【问题讨论】:
-
ForEach不是 linq 函数 -
你为什么要改变它?如果它没有损坏,请不要修复它。
-
Eric Lipert 使用“foreach”与“ForEach”的优秀帖子blogs.msdn.com/b/ericlippert/archive/2009/05/18/…
-
如果我打算做任何事情,我会将
SaveChangesAsync放在循环之外。我怀疑把它放在里面有什么好处(相反,可能会有性能损失)。 -
@Charles Mager 确实 - 将
SaveChanges()置于循环中几乎总是一个坏主意。另一方面,您为什么要准确调用异步版本?
标签: c# .net entity-framework linq async-await