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:
- tych procedura wykonywać jedno po drugim
- 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?
Entity Framework nie można ze stwardnieniem kontekście można, ale myślę, że można to zrobić z normalnego ADO.NET – brykneval