2010-08-03 4 views
5

Tengo un procedimiento almacenado, que escribe una copia de seguridad de una base de datos específica. Llamo a este SP en una aplicación C#/Formularios de Windows de manera sincronizada. Aquí está el código snipped:SQL Server2008: BeginExecuteNonQuery/EndExecuteNonQuery Problema

IAsyncResult result = command.BeginExecuteNonQuery(); 
while (!result.IsCompleted) 
{ 
    System.Threading.Thread.Sleep(1000); 
    ... 
} 
command.EndExecuteNonQuery(result)); 

Después de algún tiempo el programa sale del bucle, porque IsCompleted = true y llama EndExecuteNonQuery. El problema ahora es que el trabajo todavía está ocupado y EndExecuteNonQuery es bloqueado! Esto provoca un tiempo de espera del servidor después de algunos minutos. Parece que el valor de IsCompleted no es coherente, respectivamente, ¿qué ocurre con IsCompleted? ¿Cómo puedo lograr que mi programa reconozca el "estado de trabajo real"?

+1

¿Existe una razón por la que no se utiliza la sobrecarga de devolución de llamada para ¿BeginExecuteNonQuery y espera a que se llame la devolución de llamada antes de llamar a EndExecuteNonQuery? – btlog

Respuesta

3

Asegúrese de que su procedimiento almacenado no imprime nada y no tiene informes de recuento (SET NOCOUNT ON). Las llamadas Async TDS devuelven la llamada al , el primer paquete enviado por el servidor, pero este paquete puede ser un resultado intermedio (como en 1 row updated) y puede pasar mucho tiempo, mucho antes de la finalización real. ¿Esto es una mierda? Sí. ¿Puedes hacer algo al respecto? Nº

Como nota al margen, es infinitamente más eficiente para pasar sólo una devolución de llamada a la BeginExecute (...):

// Set form's state to 'executing', 
// eg. Button.Enabled = false; label.Text = 'Executing'; 
command.BeginExecuteNonQuery((asyncstate)=> 
{ 
    try 
    { 
     command.EndExecuteNotQuery(); 
    } 
    catch(SqlException ex) 
    { 
    ... 
    } 
    // Reset the form's state to 'Ready' 
    Invoke (()=> 
    { 
    // eg. Button.Enabled = true; label.Text = 'Ready'; 
    } 
} 
Cuestiones relacionadas