2011-07-19 12 views
7

En este momento, estoy usando un hilo de trabajador de fondo para verificar algo cada cierto tiempo y si se cumplen las condiciones se genera un cuadro de mensaje.En una aplicación de winforms, ¿cómo se puede ejecutar un mensaje de un trabajador en segundo plano que siempre debe estar en primer plano?

No me di cuenta por un momento que como llamo al mensaje en el segundo plano, pierdo el comportamiento habitual de messagebox de no permitir que el usuario haga clic en el formulario principal antes de hacer clic en sí/no/cancelar en el buzon de mensaje.

Entonces, ¿hay alguna opción en el cuadro de mensaje para mantenerlo en primer plano siempre? ¿O es posible enviar un mensaje del trabajador en segundo plano al formulario principal para que pueda generar el mensaje desde allí? ¿Hay otra manera?

Gracias

Isaac

Respuesta

9

Un trabajador de fondo es un hilo diferente a la forma ventanas. Por lo tanto, debe permitir que su asistente social de alguna manera regrese la información al hilo principal. En el ejemplo siguiente, uso la funcionalidad reportProgress del backgroundworker, ya que el evento se desencadena en el subproceso de formulario de Windows.

public partial class Form1 : Form 
{ 
    enum states 
    { 
     Message1, 
     Message2 
    } 
    BackgroundWorker worker; 

    public Form1() 
    { 
     InitializeComponent(); 
     worker = new BackgroundWorker(); 
     worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 
     worker.WorkerReportsProgress = true; 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //Fake some work, report progress 
     worker.ReportProgress(0, states.Message1); 
    } 

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     states state = (states)e.UserState; 
     if (state == states.Message1) MessageBox.Show("This should hold the form"); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     worker.RunWorkerAsync(); 
    } 

} 

Nota: El trabajador de fondo NO se detendrá en reportProgress. Si desea que su bgworker espere hasta que se presione mbox, debe detener algo manualmente.

+0

oh eso es un truco ingenioso. ¡Apenas tengo que preocuparme por las tuercas y los pernos de las roscas de las ventanas usando esto! Lo probaré mañana. –

2

Puede usar el método Invoke de la clase Form1 para invocar el subproceso UI de ese formulario.

this.Invoke(() => MessageBox.Show("Hi")); 
Cuestiones relacionadas