2008-12-05 12 views
5

Estoy usando el PrintPreviewDialog de .net y cada vez que genera una vista previa, bloquea mi GUI en segundo plano y hace que parezca que se ha bloqueado hasta que la vista previa finaliza. Al ver que la ventana de progreso de la página de .net que aparece no es un diálogo, se puede seleccionar el fondo del terreno, que luego aparece al frente de una manera medio cerrada y bloqueada. Esto también ocurre cuando el usuario hace clic en el botón "Imprimir" en el cuadro de diálogo de vista previa, y cuando solo ejecuto PrintDocument.Print(). ¿Hay una manera fácil de modificar el código siguiente para detener la GUI de colgar cuando el usuario está esperando .net para dibujar las páginas de impresión:GUI Bloqueando cuando uso PrintDialog y PrintPreviewDialog en .net

//just showing a preview, hangs up background GUI on generating the preview 
// and when user prints straight from the preview 
this.printPreviewDialog.ShowDialog(this); 

//just trying to print a .net PrintDocument class, GUI hangs in background 
// when .net is drawing the pages 
this.printDocument.Print(); 
+0

Parece que hay un problema de rendimiento en el código para generar el documento. – GvS

Respuesta

1

Usted probablemente debería llamar a esos métodos en un hilo diferente si toman hasta la vista. Investigue el uso de BackgroundWorker para ayudarlo.

Además, podría deberse a las impresoras de Windows y no a su código (¿está usando una impresora de red? En caso afirmativo, cambie a una impresora virtual y vea si eso cambia algo).

+0

Sí, he estado tratando de pensar en una forma de hacerlo, pero no se puede ejecutar this.printPreviewDialog.ShowDialog (this); en un hilo separado, ya que obtendrá una excepción de hilo cruzado para tratar de acceder a los componentes de la GUI. – EMaddox84

+0

¿Sabes por qué tarda tanto, hay algún método al que llames que sea responsable por el tiempo y que pueda llevarse a otro hilo? – gcores

+0

Debe asegurarse de esto.printPreviewDialog se construye en un hilo de fondo, no solo llamando a ShowDialog desde otro hilo – grepsedawk

1

el método ShowDialog crea una ventana modal, bloquea el hilo principal. el método Show crea una ventana no modal, no bloquea el hilo principal.

Cuando se llama a

this.printDocument.Print();

de nuevo hace su trabajo en el hilo principal.

hacer eso en un subproceso de fondo, usted podría intentar algo así como (la parte superior de la cabeza)

ThreadPool.QueueUserWorkItem ((obj) => this.printDocument.Print());

utiliza un nuevo hilo para imprimir el documento, en lugar del hilo principal de la GUI.

Si usted quiere saber más, usted tiene que investigar enhebrar

3

Otra opción sería estar girando un nuevo hilo de interfaz de usuario:

ThreadStart ts =() => 
{ 
    printDocument.Print(); 

    // Start the message loop to prevent the thread from finishing straight away. 
    System.Windows.Forms.Application.Run(); 
}; 
Thread t = new Thread(ts); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 

Tenga en cuenta que este código no se ha probado y puede necesitar algunos ajustes (especialmente la parte de bucle de mensajes), y es posible que también desee tener en cuenta que deberá cerrar el hilo en algún momento, por lo que quizás desee que una clase maneje la interacción y la administración de por vida.

+1

Nunca antes había visto esa construcción. ¿Por qué no usar ThreadPool en su lugar? – foson

+0

Funciona bien para mí. Necesitaba refrescarme en la ventana principal mientras imprimía :) –

+0

Ejemplo para WPF: https://stackoverflow.com/questions/7335507/printing-the-content-of-a-documentviewer-in-a-different-ui -hilo –

0

Dot Net Rocks TV (dnrtv) explica cómo ejecutar cosas en un subproceso en segundo plano para mantener el hilo de la GUI libre en episode 16.

Cuestiones relacionadas