2015-12-09 10 views
5

Mam kod na przycisku kliknij tak:Dlaczego klepsydra (WaitCursor) przestałaby się obracać?

try 
{ 
    Cursor = Cursors.WaitCursor; 
    GenerateReports(); 
} 
finally 
{ 
    Cursor = Cursors.Default; 
    GC.Collect(); 
    GenPacketBtn.Enabled = true; 
} 

nigdzie indziej, ale w bloku finally jest ustawiony kursor z powrotem do ustawień, to jednak nie „zmęczyć” i powrócić do stanu domyślnego dla jakiś powód. Dlaczego tak się stanie i jak mogę zapewnić, że nie przestanie "czekać", dopóki wielki tatuś wszystkich procesów (GenerateReports()) nie zostanie ukończony?

+1

Czy funkcja GenerateReports jest asynchroniczna? –

+0

Nie, nie mam kodu asynch. –

+0

Nie ma powodu, aby "przestał czekać" na zakończenie funkcji GenerateReports(). Czy możemy zobaczyć, co jest w tej funkcji? –

Odpowiedz

3

Użyj zamiast tego Control.UseWaitCursor = true, to nie kończy się limit czasu.

Jeśli wykonywana jest kosztowna operacja, Windows przejmie kontrolę i zmieni ona Cursor.WaitCursor na wszystko, co uzna za konieczne. Tak więc z Cursor.WaitCursor będzie to albo z powodu przekroczenia limitu czasu (ale nie do końca pewny) albo ze względu na system Windows po prostu przypisywanie własności kursora bez względu na jego poprzedni stan. Mieliśmy również podobną sytuację, w której Cursor nie zachowywał się zgodnie z oczekiwaniami podczas wykonywania kosztownego zadania, które wymagało zwanych firm trzecich konwerterów PDF, ale nie badaliśmy więcej natury problemu, ponieważ nie było to priorytetem.

Po kawałku czytania, okazało się, ustawiając kursor Klepsydra jest nieco bardziej skomplikowana niż się wydaje:

.net WaitCursor: how hard can it be to show an hourglass?

również jako marginesie: należy użyć Cursor.Current = Cursors.WaitCursor jak to zmusza kursor aby zmienić na zajęty natychmiast, więcej szczegółów pod adresem: https://stackoverflow.com/a/302865/1463733