Devo chiamare più stored procedure che consumano tempo. Idealmente, quelle procedure devono essere eseguite nello stesso tempo ma sollevano molti problemi.Chiamare più stored procedure utilizzando Async/Await e EntityFramework
ecco il codice semplificato:
private async void refresh_Controle(object sender, RoutedEventArgs e)
{
SqlParameter param1 = new SqlParameter("@devicename", DeviceName);
Task<int> mcResult = GenkaiBase.Database.ExecuteSqlCommandAsync("exec Refresh_McAfee @devicename", param1);
int Mc = await mcResult;
SqlParameter param2 = new SqlParameter("@devicename", DeviceName);
Task<int> dcaiResult = GenkaiBase.Database.ExecuteSqlCommandAsync("exec Refresh_DCAI @devicename", param2);
int Dc = await dcaiResult;
}
Questo ha 2 numeri:
- coloro procedura di eseguire uno dopo l'altro
- se chiamo questo più di una volta, ho uno SQL Errore del server in cui una delle procedure viene scelta come vittima.
ho provato a chiamare le due procedure nello stesso tempo con questo codice in un metodo asincrono:
public async Task<bool> Refresh_Control(string devicename)
{
List<Task> Tlist = new List<Task>();
Console.WriteLine("Launch Refresh");
SqlParameter param1 = new SqlParameter("@devicename", devicename);
Task<int> mcResult = Genkai_db.Database.ExecuteSqlCommandAsync("exec Refresh_McAfee @devicename", param1);
SqlParameter param2 = new SqlParameter("@devicename", devicename);
Task<int> dcaiResult = Genkai_db.Database.ExecuteSqlCommandAsync("exec Refresh_DCAI @devicename", param2);
Console.WriteLine("all set");
Tlist.Add(mcResult);
Tlist.Add(dcaiResult);
await Task.WhenAll(Tlist.ToArray());
int mc = await mcResult;
int dc = await dcaiResult;
Console.WriteLine("Finish Refresh" + mc + dc);
return true;
}
La logica va bene per cosa invio simultaneo ma la seconda procedura genera un errore causare primo non è ancora finito.
errore tradotta da goole:
Un'eccezione di tipo 'System.NotSupportedException' si è verificato in EntityFramework.dll ma non è stata gestita nel codice utente
Informazioni aggiuntive: Una seconda operazione è stato avviato in questo contesto prima che una precedente operazione asincrona sia stata completata. Utilizzare "attendere" per assicurarsi che tutte le operazioni asincrone siano state completate prima di chiamare un altro metodo in questo contesto. Nessuna istanza membro è garantita come thread-safe.
Quindi, qual è l'accordo, perché non posso richiamare più stored procedure contemporaneamente senza essere bloccato da SQL Server?
quadro entità non si può, si può con contesto più, ma credo che si può fare questo con ADO.NET normale – brykneval