6

Muszę zadzwonić do wielu procedur przechowywanych, które zużywają czas. Idealnie te procedury muszą być wykonywane jednocześnie, ale powoduje to wiele problemów.Zadzwoń do wielu procedur przechowywanych za pomocą Async/Await i EntityFramework

Oto uproszczony kod:

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; 
} 

ten ma 2 problemy:

  1. tych procedura wykonywać jedno po drugim
  2. jeśli zgłoszę to więcej niż raz, mam SQL Błąd serwera, gdy jedna z procedur została wybrana jako ofiara.

Próbowałem nazywając dwie procedury w tym samym czasie z tym kodem w sposób asynchroniczny:

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; 
} 

Logika jest w porządku do wysyłania rzeczy jednoczesne ale druga procedura wygeneruje błąd powodują pierwszy jeszcze się nie skończył.

błąd przekład goole:

wyjątek typu 'System.NotSupportedException' w module EntityFramework.dll ale nie traktowane kodu użytkownika

Dodatkowe informacje: a druga operacja został uruchomiony w tym kontekście przed zakończeniem poprzedniej operacji asynchronicznej. Użyj "czekać", aby upewnić się, że wszystkie operacje asynchroniczne zostały zakończone przed wywołaniem innej metody w tym kontekście. Żadna instancja członka nie jest gwarantowana jako bezpieczna dla wątków.

Więc jaki jest sens, dlaczego nie mogę połączyć się z kilkoma procedurami przechowywanymi w tym samym czasie bez utknięcia przez serwer SQL?

+1

Entity Framework nie można ze stwardnieniem kontekście można, ale myślę, że można to zrobić z normalnego ADO.NET – brykneval

Odpowiedz

5

Aktualizacja

wierzę, że jest to po prostu nie jest obsługiwana przez EF w tym momencie, a być może jest to pytanie na podstawie duplikatu this SO answer. Nie da się tego zrobić ... Przepraszam.

Original

Problem jest to, że starają się await je dwukrotnie. Kiedy przekazujesz je do funkcji await Task.WhenAll, działają równolegle i czekają. Później próbujesz ponownie je poczekać, zamiast uzyskać dostęp do instancji zadania.

Proszę spróbować kodu poniżej i daj mi znać, jeśli to działa.

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

on podnieść ten sam błąd niż mój drugi exemple na linii startu z zadaniem dcaiResult =. (patrz błąd w głównym wpisie) .a cmd jest już uruchomiona muszę poczekać przed exec a drugi? – Zwan

+0

czeka, nie uruchamia zadań, czeka na zadania już uruchomione. W chwili Task.WhenAll hin oba zadania są już uruchomione. – usr

+0

tak i błąd nie jest oczekiwany w chwili, gdy wykonamy drugą procedurę. Jego eter EF lub serwer SQL, które odrzucają exec.Ale wątpię, że nie ma na to żadnego rozwiązania. – Zwan

Powiązane problemy