6

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:

  1. coloro procedura di eseguire uno dopo l'altro
  2. 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?

+1

quadro entità non si può, si può con contesto più, ma credo che si può fare questo con ADO.NET normale – brykneval

risposta

5

Aggiornamento

Credo che questo non è semplicemente supportato da EF a questo punto nel tempo, e forse questa è una domanda duplicato sulla base di this SO answer. Non si può fare ... Scusa.

originale

Il problema è che si sta cercando di await due volte. Quando li passi nella funzione await Task.WhenAll, vengono eseguiti in parallelo e attesi. Quindi, in seguito, si sta tentando di attendere di nuovo, invece di accedere allo .Result dell'istanza dell'attività.

Si prega di provare il codice qui sotto e fammi sapere se funziona.

public async Task Refresh_Control(string devicename) 
{ 
    Task<int> mcResult = 
     Genkai_db.Database.ExecuteSqlCommandAsync("exec Refresh_McAfee @devicename", 
      new SqlParameter("@devicename", devicename)); 
    Task<int> dcaiResult = 
     Genkai_db.Database.ExecuteSqlCommandAsync("exec Refresh_DCAI @devicename", 
      new SqlParameter("@devicename", devicename)); 

    await Task.WhenAll(mcResult, dcaiResult); 

    int mc = mcResult.Result; 
    int dc = dcaiResult.Result; 

    Console.WriteLine("Finish Refresh :: mc=" + mc + ", dc=" + dc); 
} 
+0

E sollevare lo stesso errore che il mio secondo exemple alla linea di partenza con il Task dcaiResult =. (vedi l'errore nel post principale). un cmd è già stato lanciato devo aspettare prima di eseguire un secondo uno ??? – Zwan

+0

attendi non esegue attività, attende attività già in esecuzione. Al momento Task.WhenAll is hin entrambe le attività sono già in esecuzione. – usr

+0

sì e l'errore non è in attesa della sua rigidità alla riga che eseguono la seconda procedura. Il suo ether EF o SQL server che respinge l'exec.Ma dubito che non abbia alcuna correzione a questo. – Zwan