Chciałbym dać użytkownikowi możliwość anulowania uruchomionego zapytania. Zapytanie jest naprawdę powolne. (Optymalizacja zapytań jest poza tym punktem). Wynika to głównie z mojej ciekawości.Czy kwerendy serwera sql mogą być naprawdę anulowane/zabite?
MSDN mówi:
Jeśli nie ma nic, aby anulować, nic nie występuje. Jeśli jednak w procesie istnieje polecenie , a próba anulowania nie powiedzie się, nie wygenerowano żadnego wyjątku .
- Cmd - SQLCommand
- DA - DataAdapter
- Conn - SqlConnection
- CurrentSearch - Temat
- LongQuery - Singleton
Oto co mam:
var t = new Thread(AbortThread);
t.Start();
void AbortThread()
{
LongQuery.Current.Cmd.Cancel();
LongQuery.Current.Cmd.Dispose();
LongQuery.Current.DA.Dispose();
LongQuery.Current.Conn.Close();
LongQuery.Current.Conn.Dispose();
LongQuery.Current.Cmd = null;
LongQuery.Current.DA = null;
LongQuery.Current.Conn = null;
CurrentSearch.Abort();
CurrentSearch.Join();
CurrentSearch = null;
}
Zauważyłem, że blokuje się CurrentSearch.Abort()
, dlatego zawinąłem go w nitkę, co prawdopodobnie oznacza, że wątek nadal działa.
Czy jest coś jeszcze, co mogę zrobić, aby anulować zapytanie? Czy rzeczywiście można anulować tak długie zapytanie z .NET?
jest zapisywanie danych kwerendy, albo po prostu go czytać? –
@BrianKnight Po prostu czytanie z wielu widoków. – Candide