Tengo una pequeña aplicación que necesita para probar las cadenas de conexión de SQL para una serie de conexiones (cada uno hecho de uno en uno). Para hacer esto, establezco el ConnectionTimeout = 5
temporalmente para evitar una larga espera si la conexión no es válida y ConnectionTimeout = 0
(espere para siempre), por ejemplo.TPL Cómo realizar una 'devolución de llamada'
Para evitar el ahorcamiento de interfaz de usuario mientras se intenta Open()
una mala conexión (incluso con ConnectionTimeout = 5
la espera para la SqlException
puede ser de hasta veinte segundos), quiero ejecutar la prueba en un hilo separado usando tarea paralela Biblioteca (TPL) Por lo tanto, spin-off de mi nuevo hilo como:
Task<bool> asyncTestConn = Task.Factory.StartNew<bool>
(() => TestConnection(conn, bShowErrMsg));
return asyncTestConn.Result;
El problema es que esto todavía está bloqueando la interfaz de usuario (claramente), ya que está esperando el resultado antes de regresar a la persona que llama. ¿Cómo permito que el código devuelva el control a la IU (liberando la GUI) mientras obtengo el resultado final del Task
asincrónico?
Además, desde dentro de un Task
legítimamente puedo hacer MessageBox.Show("Some message")
? Esto no funciona para BackgroundWorkers
y este subproceso agrupado es un subproceso de fondo por defecto; sin embargo, no parece ser un problema. Gracias por tu tiempo.
Muchas gracias por su respuesta. La idea es volver a pasar el control a la interfaz de usuario/GUI lo antes posible, ¿cómo/lo anterior puede lograrlo? Si estoy llamando al código anterior desde un método llamado 'ParrTestConn (conexión de SqlConnection, string bShowErrMsg)', entonces no puedo decir 'asyncTestConn.ContinueWith (ParrTestConn (conn, bShowErrMsg))' ... ¿O puedo? – MoonKnight
@Killer Puede simplemente regresar después del Inicio(). La GUI debe seguir siendo receptiva al usar esto. –
No tengo el método 'Task.Factory.Create' avilible? –
MoonKnight