2009-07-22 13 views
5

Tengo un formulario que inicia un hilo. Ahora quiero que el formulario se cierre automáticamente cuando termine este hilo.Llamar a un método cuando termina el hilo

La única solución que encontré hasta ahora es agregar un temporizador al formulario y comprobar si el hilo está activo en cada tic. Pero quiero saber si hay una mejor manera de hacerlo.

Actualmente mi código se parece más a menos así

partial class SyncForm : Form { 
    Thread tr; 

    public SyncForm() 
    { 
     InitializeComponent(); 
    } 

    void SyncForm_Load(object sender, EventArgs e) 
    { 
     thread = new Thread(new ThreadStart(Synchronize)); 
     thread.IsBackground = true; 
     thread.Start(); 
     threadTimer.Start(); 
    } 

    void threadTimer_Tick(object sender, EventArgs e) 
    { 
     if (!thread.IsAlive) 
     { 
      Close(); 
     } 
    } 

    void Synchronize() 
    { 
     // code here 
    } 
} 

Respuesta

10

existe La clase BackgroundWorker para este tipo de gestión de hilos para ahorrarle tener que rodar su propia; ofrece un evento RunWorkerCompleted que puedes escuchar.

+0

funciona muy bien, gracias – RaYell

6

Editar para que se llame un método de ayuda por lo que es más limpio.

thread = new Thread(() => { Synchronize(); OnWorkComplete(); }); 

... 

private void OnWorkComplete() 
{ 
    Close(); 
} 
+0

Esto no funciona si los métodos anteriores tiene parámetros y varios subprocesos. Sync (param1) toma 30 segundos, y cuando se ejecuta OnWorkComplete tengo paramx en el param1 actual y obtengo resultados incorrectos :( – Sakthivel

+0

Tampoco funciona si no tiene Linq ... –

6

Si usted tiene un vistazo a una BackgroundWorker, hay un evento RunWorkerCompleted que se llama cuando el trabajador complete.

Para obtener más información sobre BackgroundWorkers Click Here

O

Se podría añadir una llamada a una función completa del hilo una vez que ha terminado, e invocarlo.

void Synchronize() 
{ 
    //DoWork(); 
    //FinishedWork(); 
} 

void FinishedWork() 
{ 
if (InvokeRequired == true) 
    { 
    //Invoke 
    } 
else 
    { 
    //Close 
    } 
} 
1

Tener un vistazo a los delegados, IAsyncResult, BeginInvoke y AsyncCallback

1

Al final de su método de hilo, puede llamar a Close() utilizando el método Invoke() (debido a los métodos de la mayoría de WinForms deben ser llamados del hilo de interfaz de usuario):

public void Synchronize() 
{ 
    Invoke(new MethodInvoker(Close)); 
} 
Cuestiones relacionadas