Szukam od pewnego czasu odpowiedzi na mój konkretny problem bez powodzenia.Zamykanie formularza utworzonego w innym wątku
Mam zadanie w moim programie, które zajmuje kilka sekund i chcę pokazać nowy formularz podczas wykonywania tego zadania. Nowy formularz ma pasek ładowania i trochę tekstu.
Muszę pokazać nowy formularz równolegle do zadania, w przeciwnym razie zadanie nie rozpocznie się do momentu zamknięcia nowego formularza.
To rozwiązanie mam teraz:
private void loadingBar()
{
frmLoading frm = new frmLoading("Please wait while the database is being backed up", "This might take several days.");
frm.ShowDialog();
}
public void Backup()
{
Thread load = new Thread(new ThreadStart(loadingBar));
load.Start();
///Execute a task.
load.Abort();
}
Tak, to działa OK, ale moje pytanie brzmi: nie byłoby lepiej byłoby, aby zamknąć formularz „frm” w obciążeniu gwintem zrobić to się zatrzymuje?
Traktuj to jak działa pasek postępu. Uruchom "proces" jako podrzędny wątek tła do formularza, który chcesz pokazać. Następnie wywołaj ten formularz z wątku "Main". Główny wątek zostanie zablokowany z pokazanym formularzem ładowania, a formularz ładowania uruchomi coś jako wątek w tle. W ten sposób sam formularz ładowania może śledzić proces i zamknąć się po jego zakończeniu. – Nevyn
@Dave Dlaczego po prostu nie użyć 'backgroundWorker'? Również - Możesz chcieć rozważyć umieszczenie tego kodu dla wątku w instrukcji 'Using()', to następnie się wyrzuci po zakończeniu. – Hexie
Jest to zasadniczo niewłaściwa rzecz. Istnieje kilka bardzo nieprzyjemnych trybów awaryjnych wyświetlania interfejsu użytkownika w wątku roboczym.Trzeba to zrobić odwrotnie, wyświetlić okno "ładowanie" w wątku UI, wykonać kopię zapasową w wątku roboczym. –