2011-04-05 9 views
7

este es un fragmento de mi clase:C# .net - ¿Cómo alertar al programa de que el subproceso ha finalizado (controlado por evento)?

public bool start() 
{ 
    Thread startThread = new Thread(this.ThreadDealer); 
    startThread.Start(); 
    return _start; 
} 

En ThreadDealer() Estoy estableciendo la variable booleana "_start" a falso o verdadero. Lo que necesito ahora pero no puedo entender es un evento para alertar a start() para que ejecute su declaración de devolución cuando el ThreadDealer() - Thread haya terminado.

Probé algo con AutoResetEvent y .WaitOne() pero como tengo una GUI que simplemente bloquea todo y mientras hace lo que necesito hacer (esperar a que termine el subproceso) es inútil si bloquea mi GUI.

Cualquier ayuda sería muy apreciada.

Respuesta

6

Solo levante un evento. Se ejecutará en el hilo equivocado, por lo que cualquier controlador de eventos tiene que lidiar con eso mediante el cálculo de la llamada si es necesario para actualizar cualquier interfaz de usuario. Al usar Control.Begin/Invoke o Dispatcher.Begin/Invoke, dependiendo de la biblioteca de clase que use.

O utilice la clase BackgroundWorker, lo hace automáticamente.

24

Lo que se quiere hacer - espera para el subproceso de fondo en un método para el hilo de interfaz de usuario, pero todavía permiten la interfaz de usuario que sea sensible - no es posible. Es necesario dividir el código en dos partes: una ejecutada antes de iniciar (o paralelamente a) el hilo de fondo y la otra ejecutándose después de que el hilo de fondo haya finalizado.

La manera más fácil es usar el BackgroundWorker class. Se genera un evento en el hilo de la interfaz de usuario (RunWorkerCompleted) después de que se haya completado su trabajo. Aquí hay un ejemplo:

public void start() 
{ 
    var bw = new BackgroundWorker(); 

    // define the event handlers 
    bw.DoWork += (sender, args) => { 
     // do your lengthy stuff here -- this will happen in a separate thread 
     ... 
    }; 
    bw.RunWorkerCompleted += (sender, args) => { 
     if (args.Error != null) // if an exception occurred during DoWork, 
      MessageBox.Show(args.Error.ToString()); // do your error handling here 

     // Do whatever else you want to do after the work completed. 
     // This happens in the main UI thread. 
     ... 
    }; 

    bw.RunWorkerAsync(); // starts the background worker 

    // execution continues here in parallel to the background worker 
} 
Cuestiones relacionadas