2011-09-15 3 views
6

Mam wiele metod (działają one tylko po jednym na raz), wszystkie używają tych samych metod RunWorkerCompleated i ProgressChanged, ale wszystkie mają różne metody Dowork. Czy można bezpiecznie wykonać następujące czynności:Czy można bezpiecznie zrezygnować z DoWork po wywołaniu RunWorkerAsync, ale przed wyjściem funkcji?

private void button_Process_Click(object sender, EventArgs e) 
{ 
    bgWork_Process.DoWork += Scrub_DoWork; 
    bgWork_Process.RunWorkerAsync(); 
    bgWork_Process.DoWork -= Scrub_DoWork; 
} 

lub czy mogę zrobić to w skrajnym przypadku? Nie widziałem nic na MSDN na to, mówiąc, że nie było dozwolone i jak (do tej pory) działało dobrze w moim programie, ale chciałem sprawdzić tutaj, czy ktoś nie wpadł na kłopoty, aby to zrobić.

+0

Tak, to jest zapis. a inną metodą jest wątek. –

Odpowiedz

1

Co można zrobić, aby upewnić się, że obsługi zdarzeń nie jest usuwana aż skończysz byłoby zrobić coś podobnego do

Action DoWorkAction; 

private void button_Process_Click(object sender, EventArgs e) 
{ 
    gbHistory.Enabled = false; 
    gbScrub.Enabled = false; 
    DoWorkAction = new Action(Scrub_DoWork); 
    bgWork_Process.DoWork += DoWorkAction; 
    bgWork_Process.RunWorkerAsync(); 
} 

I cokolwiek obsługuje Twój ukończenie

private void bgWork_Process_CompletedHandler(object sender, EventArgs e) 
{ 
    bgWork_Process.DoWork -= DoWorkAction; 
} 

Czuję jednak; że może być lepiej po prostu mieć oddzielne BackGroundWorkers dla wszystkich twoich Działań, które musisz wykonać, zamiast dzielić się tym z podobnym lub zawijać w klasie, abyś mógł lepiej zrozumieć, co robisz.

+0

Myślę, że mam zamiar użyć oddzielnych pracowników działających w tle, jak sugerowaliście, ale nadal chciałbym wiedzieć, czy tak, czy nie, jeśli to, co robiłem w moim programie operacyjnym, było bezpieczne, czy nie. –

+0

@ScottChamberlain Jestem prawie pewny, że jest bezpieczny, ponieważ działa wzorzec zdarzeń, zdarzenie zostaje wyrzucone z RunWorkerAsync, które uruchamia pracownika działającego w tle, który już ma delegata dla Delegata DoWork, a następnie usuwa go, po tym wszystkim ma zajęte miejsce. – msarchet

+0

Dzięki, ale kiedy i gdzie powinienem wyrejestrować 'RunWorkerCompleted' na' BackgroundWorker'? – Agent007