2009-11-06 21 views

Odpowiedz

18

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 ThreadPoolbackground, tak, skończy się, gdy aplikacja się zakończy.

Jednak należy pamiętać, że:

  1. „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.

  2. 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

0

Jeśli aplikacja całkowicie się zamknie (ponieważ nic nie uniemożliwia jej wyłączenia), pracownicy w tle również znikną.

+3

To rodzaj okrągłej odpowiedzi. Jeśli pracownicy w tle nie zostaną automatycznie zatrzymani po zamknięciu aplikacji, zapobiegną zamknięciu aplikacji. –

-1

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ć.

0

Po zakończeniu procesu wszystkie powiązane wątki również zniknęły.

+0

Z wyjątkiem sytuacji, gdy ich właściwość 'IsBackground' ma wartość' false'. – Groo

+0

Co uniemożliwiłoby zakończenie procesu. Tak więc odpowiedź brzmi;) – dkackman

7

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.

0

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ą.

1

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); 
     } 
    } 
} 
Powiązane problemy