2012-04-19 11 views
5

Mam w następstwie pokoju kodu:Jaki jest najlepszy sposób, aby złapać „Operacja anulowana przez użytkownika” wyjątek

IAsyncResult beginExecuteReader = command.BeginExecuteNonQuery(); 

while (!beginExecuteReader.IsCompleted) 
{ 
    if (controllerTask.CancellationTokenSource.IsCancellationRequested) 
    { 
     command.Cancel(); 
    } 

    Thread.Sleep(100); 
} 

try 
{ 
    result = command.EndExecuteNonQuery(beginExecuteReader); 
} 
catch (SqlException exception) 
{ 
    if (exception.ErrorCode == OperationCanceled) 
    { 
     throw new OperationCanceledException(); 
    } 

    throw; 
} 

jaki sposób można zidentyfikować, że przechwycony wyjątek spowodowany jest anulowanie operacji. W tym przypadku ExecuteNonQuery zgłasza wyjątek z kodem błędu 0x80131904, ale jest to bardzo ogólny wyjątek, który może być spowodowany wieloma przyczynami. Komunikat o błędzie wygląda następująco: {"Wystąpił poważny błąd w bieżącej komendzie. Wyniki, jeśli są, powinny zostać odrzucone. \ R \ nOperacja anulowana przez użytkownika."}

Nie widzę żadnych opcji z wyjątkiem parsowanie komunikatu o błędzie ... Jakieś pomysły?

Dzięki

PS. Tak, wiem, że polecenie Anuluj dla operacji asyncronyc prawdopodobnie nie jest najlepszym pomysłem, ponieważ dla .NET 2.0 było ostrzeżenie na MSDN, ale dla .NET 4.0 to ostrzeżenie zostało usunięte. A ja też nie lubię, gdy kolejne implementacje anulować metoda jest wywoływana z innego wątku, jak dla mnie, to sprawia, że ​​kod trudniejsze

+0

Czy to jest winForm? – Likurg

+0

Nie, to jest po prostu biblioteka klas, która działa z bazą danych za pośrednictwem klas ADO.NET (.NET 4.0). Więc nie mogę użyć BackgroundWorker :) – and85

+0

Ok, użyjesz biblioteki biblioteki w winformach? Czy gdzie? – Likurg

Odpowiedz

0

więc IMHO powinieneś robić dalej:

  1. Zrób wątek, w którym będzie użyj ado (przeczytaj ten Thread example)
  2. Usuń Thread.Sleep (100); // Imho nigdy go nie używaj
  3. Dodaj do swojej klasy static bool muststop = false;
  4. Dodaj do swojej klasie funkcji public static zmienić "muststop"
  5. Zmień ci funkcji wątku, aby zatrzymać go, jeśli muststop == true

Mam nadzieję, że to pomoże Ci

-1

Można wiadomość egzamin wyjątek w bloku catch, aby stwierdzić, która operacja została anulowana przez użytkownika:

try 
{ 
    //your code 
} 
catch (SqlException ex) 
{ 
    if (ex.Message.Contain("Operation cancelled by user")) 
    { 
     //Do something here 
    } 
} 
Powiązane problemy