Proste pytanie, aby powtórzyć tytuł:Czy zamykanie aplikacji zatrzymuje wszystkich aktywnych BackgroundWorkers?
Czy zamykanie aplikacji WinForms powoduje zatrzymanie wszystkich aktywnych BackgroundWorkers?
Proste pytanie, aby powtórzyć tytuł:Czy zamykanie aplikacji zatrzymuje wszystkich aktywnych BackgroundWorkers?
Czy zamykanie aplikacji WinForms powoduje zatrzymanie wszystkich aktywnych BackgroundWorkers?
Tak, robi.
BackgroundWorker.RunWorkerAsync
po prostu wywołuje BeginInvoke
na wewnętrznym uczestniku, który z kolei umieszcza żądanie w kolejce do ThreadPool
. Ponieważ wszystkie wątki ThreadPool
są background, tak, skończy się, gdy aplikacja się zakończy.
Jednak należy pamiętać, że:
„zamknięciem aplikacji WinForms” Jestem zakładając zamknięcie instancjigłówny Form
(to zazwyczaj jeden przeszedł do Application.Run
w klasie Program
wygenerowaną automatycznie przez Visual Studio). Jeśli masz okno potomne z pracownikiem działającym w tle, to nie zatrzyma ono automatycznie swojego BackgroundWorker
.
Letting wątek tła zostać przerwana na wyjściu aplikacji jest nie zalecany sposób na zakończenie wątku, jak nie masz gwarancji, gdzie zostanie ona przerwana. Znacznie lepszym sposobem byłoby zasygnalizowanie pracownika przed zamknięciem, oczekiwanie, aż zakończy się z wdziękiem, a następnie wyjście.
Więcej informacji: Delegate.BeginInvoke, MSDN on Thread Pooling, Thread.IsBackground
Jeśli aplikacja całkowicie się zamknie (ponieważ nic nie uniemożliwia jej wyłączenia), pracownicy w tle również znikną.
Myślę, że tak. Ponieważ wątki są powiązane z procesem, a jeśli proces jest zamknięty, wszystkie wątki muszą się kończyć.
BackgroundWorker wątki są wątków tła (ThreadPool wątków), which die when the application dies.
Jedyny sposób, w jaki wątek może przejść dalej po zatrzymaniu wątku głównego (UI), jest tworzony w sposób wyraźny, przez utworzenie nowej instancji wątku i ustawienie wartości IsBackground jako fałszywej. Jeśli tego nie zrobisz (lub jeśli użyjesz ThreadPool, który spawnuje wątki w tle - lub BackgroundWorker, który również wewnętrznie korzysta z ThreadPool), twój wątek będzie wątkiem tła i zostanie zakończony po zakończeniu głównego wątku.
Przede wszystkim, tak aby ta odpowiedź prosta:
Gdy proces został zamknięty, wszystkie jej gwinty zostały zakończone. Nie ma co do tego wątpliwości.
pytanie, jak interpretować to, co staje się:
Czy nadal działa
BackgroundWorker
przypadki zapobiec aplikacji z zamknięciem?
Odpowiedź na , że pytanie brzmi: Nie, nie będą.
Tak, będzie. Napisałem ten prosty formularz, a zamknięcie formularza opuszcza aplikację:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (true)
{
Thread.Sleep(100);
}
}
}
To rodzaj okrągłej odpowiedzi. Jeśli pracownicy w tle nie zostaną automatycznie zatrzymani po zamknięciu aplikacji, zapobiegną zamknięciu aplikacji. –