mam EF klasy pomocnika, który zapisuje zmiany asynchronicznie:Entity Framework 6.1.0 SaveChangesAsync
public async Task<int> SaveOrUpdateAsync<TEntity>(TEntity entity)
where TEntity : class, IContextEntity
{
if (entity.Id == 0)
context.Set<TEntity>().Add(entity);
else
{
TEntity dbEntry = context.Set<TEntity>().Find(entity.Id);
if (dbEntry != null) dbEntry = entity;
}
return await context.SaveChangesAsync();
}
public void Save()
{
Task saveEntit1Async = repository.SaveOrUpdateAsync<Entity1>(entity1);
Task saveEntity2Async = repository.SaveOrUpdateAsync<Entity2>(entity2);
Task saveEntity3Async = repository.SaveOrUpdateAsync<Entity3>(Entity3);
Task.WaitAll(saveEntit1Async, saveEntity2Async, saveEntity3Async);
string test = "test";
)
Wezwanie utknie na
Task.WaitAll(saveEntit1Async, saveEntity2Async, saveEntity3Async);
linii i nigdy nie trafia do
string test = "test";
Ale jeśli uruchomię to jako:
public void Save()
{
repository.SaveOrUpdateAsync<Entity1>(entity1);
repository.SaveOrUpdateAsync<Entity2>(entity2);
repository.SaveOrUpdateAsync<Entity3>(Entity3);
string test = "test";
)
To działa dobrze, wszystkie zmiany są zapisywane i robi się
string test = "test";
Dlaczego
Task.WaitAll(saveEntit1Async, saveEntity2Async, saveEntity3Async);
zawiesza operację i nigdy nie przekazuje rozmowę do następnej linii kodu (test ciąg = "test";)?
Task.WaitAll, system nie blokuje bieżącego wątku wykonania, a następna linia zostanie wykonana, z Task.WaitAll, bieżący wątek będzie czekał aż wszystkie operacje zostaną wykonane, następnie ciąg test = 'test'; zostaje wykonany – Sherlock
Dobrze! Ale dlaczego telefon utknął na WaitAll na zawsze! i nigdy nie dociera do drugiej linii? –
możesz mieć wyjątek w zadaniu, który może nigdy nie wrócić, więc będzie czekać na zawsze – Sherlock