2012-04-19 14 views
5

he tras la paz de código:¿Cuál es la mejor manera de coger la "Operación cancelada por el usuario" excepción

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

¿Cómo puedo identificar, que atrapó excepción es causada por la operación de cancelación. En este caso, ExecuteNonQuery lanza una excepción con el código de error 0x80131904, pero es una excepción muy general que puede deberse a muchas razones. El mensaje de error tiene este aspecto: {"Se produjo un error grave en el comando actual. Los resultados, si los hay, deben descartarse. \ R \ nOperación cancelada por el usuario."}

No veo ninguna opción excepto análisis del mensaje de error ... ¿Alguna idea?

Gracias

PS. Sí, sé que el comando Cancelar para la operación asyncronyc probablemente no sea la mejor idea, porque para .NET 2.0 hubo una advertencia en MSDN, pero para .NET 4.0 esta advertencia se eliminó. Y yo también no como otras implementaciones cuando se cancela método es llamado desde otro hilo, que para mí tiene un código más difícil

+0

¿Es esto winforms? – Likurg

+0

No, esta es solo una biblioteca de clases, que funciona con bases de datos a través de clases ADO.NET (.NET 4.0). Entonces no puedo usar BackgroundWorker :) – and85

+0

Ok, ¿usarás tu biblioteca en winforms? ¿O donde? – Likurg

Respuesta

0

Así que en mi humilde opinión usted debe hacer a continuación:

  1. Hacer un hilo donde se quiere use ado (lea esto Thread example)
  2. Delete Thread.Sleep (100); // No lo uso nunca
  3. Agregue a su clase static bool muststop = false;
  4. Añadir a la función public static clase para cambiar "muststop"
  5. Cambio que la función del hilo para detenerlo si muststop == true

espero que esto ayudará a

-1

Puede mensaje de excepción examen en el bloque catch para encontrar qué operación fue cancelada por el usuario:

try 
{ 
    //your code 
} 
catch (SqlException ex) 
{ 
    if (ex.Message.Contain("Operation cancelled by user")) 
    { 
     //Do something here 
    } 
} 
Cuestiones relacionadas