2008-12-05 9 views
5

Używam PrintPreviewDialog .net i kiedy generuje podgląd, blokuje mój GUI w tle i sprawia, że ​​wygląda jak rozbił się, dopóki podgląd się nie zakończy. Widząc, że okno postępu strony .net, które się pojawia, nie jest dialogiem, można wybrać tylną płaszczyznę, która następnie przechodzi do przodu w połowie wyciągnięty, zablokowany sposób. Dzieje się tak również, gdy użytkownik kliknie właściwy przycisk "Drukuj" w oknie podglądu i kiedy po prostu uruchomię PrintDocument.Print(). Czy istnieje prosty sposób zmodyfikować poniższy kod, żeby zatrzymać GUI z wiszące, gdy użytkownik czeka na .net wyciągnąć Strony:GUI Blokowanie podczas używania PrintDialog i PrintPreviewDialog w .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

Wygląda na to, że w kodzie wystąpił problem z wydajnością, aby wygenerować dokument. – GvS

Odpowiedz

1

Należy pewnie połączenie tych metod w innym wątku, jeśli wziąć Tak długo. Zbadaj, jak korzystać z pomocy BackgroundWorker.

Może to być również spowodowane drukarkami systemu Windows, a nie kodem (czy używasz drukarki sieciowej? Jeśli tak, zmień drukarkę wirtualną i zobacz, czy to coś zmieni).

+0

Tak, próbowałem wymyślić sposób to zrobić, ale nie można uruchomić this.printPreviewDialog.ShowDialog (this); w osobnym wątku, ponieważ uzyskasz wyjątek krzyżowy dla próby dostępu do komponentów GUI. – EMaddox84

+0

Czy wiesz, dlaczego trwa to tak długo, czy istnieje jakaś metoda, która jest odpowiedzialna za czas i która może zostać przeniesiona do innego wątku? – gcores

+0

Musisz się tego upewnić.printPreviewDialog jest zbudowany w wątku tła, a nie tylko wywoływania ShowDialog z innego wątku. – grepsedawk

1

Metoda ShowDialog tworzy okno modalne, blokuje główny wątek. Metoda Show tworzy niemodalne okno, nie blokuje głównego wątku.

Po wywołaniu

this.printDocument.Print();

znowu działa w głównym wątku.

Aby to zrobić w wątku tła, można spróbować czegoś podobnego (off górnej części głowy)

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

wykorzystuje nowy wątek do drukowania dokumentu, zamiast głównego wątku GUI.

Jeśli chcesz wiedzieć więcej, trzeba badać gwintowania

3

Inną opcją byłoby kręci się nowy wątek ui:

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(); 

Należy pamiętać, kod ten nie został przetestowany i może być konieczne trochę tuningu (szczególnie część pętli komunikatów) - i możesz również chcieć pamiętać, że będziesz musiał wyłączyć wątek w pewnym momencie - więc być może będziesz chciał, aby klasa obsługiwała zarządzanie interakcją i całe życie.

+1

Nigdy wcześniej nie widziałem tego konstruktu. Dlaczego zamiast tego użyć ThreadPool? – foson

+0

Ładnie działa dla mnie. Potrzebowałem odświeżenia w głównym oknie podczas drukowania :) –

+0

Przykład dla WPF: https://stackoverflow.com/questions/7335507/printing-the-content-of-a-documentviewer-in-a-different-ui -wątek –

0

Dot Net Rocks TV (dnrtv) opisuje, jak uruchamiać rzeczy w wątku tła, aby utrzymać wątek GUI w episode 16.

Powiązane problemy