Mam następujący kod, który poprawnie używa paradygmatu async/await.C# async oczekuje przy użyciu LINQ ForEach()
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);
}
}
Co jest odpowiednikiem sposób napisać to, gdyby zamiast przy użyciu foreach(), chcę użyć LINQ foreach()? Ten na przykład daje błąd kompilacji.
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);
});
}
Jedyny kod, który mam do pracy bez błędu kompilacji jest to.
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);
});
}
Martwię się, że ta metoda nie ma podpisu asynchronicznego, tylko ciało to robi. Czy to jest odpowiednik mojego pierwszego bloku kodu powyżej?
'ForEach' not a linq function – Grundy
Dlaczego w ogóle chcesz to zmienić? Jeśli nie jest zepsuty, nie naprawiaj go. –
Doskonały post od Erica Liperta za pomocą "foreach" vs "ForEach" http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –