2012-06-14 14 views
5

Używam VS2010 i C# do zbudowania aplikacji komputerowej. Ta aplikacja ma jedną formę z ogromnym zadaniem, które zajmuje dużo czasu. Kiedy ta forma jest inicjowany to działa doskonale, z wyjątkiem pokazuje „Nie odpowiada” na pasku tytułowym, jak pokazuje zdjęcie:Jak zapobiec komunikatowi Brak odpowiedzi na pasku tytułu okna?

enter image description here

Po wykonaniu wszystkich zadań, pokazuje pożądany wynik. Dlaczego wyświetlany jest ten komunikat i jak temu zapobiec?

+0

I upvoted ponieważ jest to uzasadnione pytanie dla kogoś, kto nie ma dużego doświadczenia. – siride

Odpowiedz

4

Trzeba użyć BackgroundWorker tak, że zadanie czasochłonne będą uruchamiane w osobnym wątku asynchronicznie. Umożliwi to wielozadaniowość systemu Windows w celu dostosowania interfejsu użytkownika. Powinieneś użyć kursora oczekiwania lub innego wskaźnika wizualnego, aby poinformować użytkownika, że ​​twoja aplikacja jest zajęta.

Od MSDN MSDN BackgroundWorker

Klasa BackgroundWorker pozwala uruchomić operację na osobnym, dedykowanym wątku. Czasochłonne operacje, takie jak pobieranie i transakcje bazy danych, mogą powodować, że interfejs użytkownika wydaje się być tak, jakby przestał odpowiadać, gdy są uruchomione. Jeśli potrzebujesz elastycznego interfejsu użytkownika i masz do czynienia z dużymi opóźnieniami związanymi z takimi operacjami, klasa BackgroundWorker zapewnia wygodne rozwiązanie.

Aby wykonać operację czasochłonnego w tle, utwórz BackgroundWorker i nasłuchiwać zdarzeń, które relacjonują przebieg operacji i sygnał, gdy operacja jest zakończona. Program WordWorker można utworzyć programowo lub można go przeciągnąć do formularza na karcie Komponenty zestawu narzędzi. Jeśli utworzysz BackgroundWorker w Windows Forms Designer, pojawi się on w zasobniku komponentów, a jego właściwości będą wyświetlane w oknie Właściwości.

Aby skonfigurować do działania w tle, należy dodać moduł obsługi zdarzeń dla zdarzenia DoWork. Wywołaj czasochłonną operację w tej procedurze obsługi zdarzeń. Aby rozpocząć operację, wywołaj RunWorkerAsync. Aby otrzymywać powiadomienia o aktualizacjach postępu, należy obsługiwać zdarzenie ProgressChanged. Aby otrzymać powiadomienie po zakończeniu operacji, należy obsłużyć zdarzenie RunWorkerCompleted.

1

Trzeba uruchomić ogromne zadanie na wątek tła, tak aby nie zamknąć UI (główny) nici.

+0

BlackSpy dziękuję za odpowiedź, nie rozumiem tej linii "zablokuj UI (główny) wątek", czy mógłbyś powiedzieć trochę szczegółowo. – shamim

+1

Proponuję zrobić kilka badań na temat klasy Workworker i uruchomić tam twoje procesy. To uniemożliwi zablokowanie interfejsu użytkownika podczas oczekiwania na zakończenie długotrwałej operacji. Wynika to z "pracy" uruchamianej w innym wątku niż interfejs użytkownika, więc zdarzenia interfejsu użytkownika (malowanie, odświeżanie itp.) Nie są blokowane. – tsells

Powiązane problemy