Uno dei limiti principali di EF (e di altri O/RM) è quello di non permettere l'esecuzione di più comandi in contemporanea pena il sollevamento di un'eccezione.
Esistono tuttavia molti casi in cui eseguire query in simultanea è necessario per ottimizzare le prestazioni. Pensiamo ad una dashboard dove ogni box è popolato con dati provenienti da una query diversa. In questi casi poter eseguire le query in contemporanea ottimizza parecchio le prestazioni rispetto a un'esecuzione sequenziale delle query.
Non potendo superare la limitazione di EF, dobbiamo ricorrere a un altra tecnica per eseguire le query: creare più istanze del contesto. Quando ci troviamo in una situazione dove il contesto viene passato nel costruttore, questa soluzione non sembra praticabile. Tuttavia, possiamo fare una cosa diversa: iniettare IServiceProvider e tramite questo creare uno scope di dependency injection per ogni contesto da usare. In questo modo avremo tanti contesti quante le query e ognuno può eseguire una query in contemporanea.
public class Manager(IServiceProvider sp)
{
public async Task ExecuteQueries()
{
var tasks = new Task[2];
using var s1 = sp.CreateScope();
using var s2 = sp.CreateScope();
var ctx1 = s1.ServiceProvider.GetRequiredService<MyContext>();
var ctx2 = s2.ServiceProvider.GetRequiredService<MyContext>();
tasks[0] = ctx1.People.Where(c => c.Cognome.StartsWith("A")).ToListAsync();
tasks[1] = ctx2.People.Where(c => c.Age < 18).ToListAsync();
await Task.WhenAll(tasks);
//process results
}
}Con questa tecnica, il codice da scrivere aumenta notevolmente rispetto a un approccio sequenziale. Per questo motivo, se ne suggerisce l'uso solo li dove effettivamente le performance siano una necessità irrinunciabile.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare WebJobs su Linux con Azure App Service
Controllare la telemetria con .NET Aspire
Scrivere selettori CSS più semplici ed efficienti con :is()
Testare il failover sulle region in Azure Storage
Utilizzare WhenEach per processare i risultati di una lista di task
Integrazione di Copilot in .NET Aspire
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Integrare Agenti A2A in Azure API Management
Selettore CSS :has() e i suoi casi d'uso avanzati
Personalizzare le pagine di errore su Azure App Service
Esporre un server MCP esistente con Azure API Management
Configuratione e utilizzo .NET Aspire CLI
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Le DirectInk API nella Universal Windows Platform
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Sfruttare una CDN con i bundle di ASP.NET
- Gli oggetti CallOut di Expression Blend 4.0


