Wyjaśnienie fragmentu kodu BackgroundWorker

0

Witam, wyjaśniłby mi ktoś w miarę prosto ten fragment kodu?

BackgroundWorker watek = new BackgroundWorker();
                    //ustawienie na true umożliwia korzystanie z funkcji CancelAsync.
                    watek.WorkerSupportsCancellation = true;
                    watek.DoWork += new DoWorkEventHandler(watek_DoWork);
                    watek.RunWorkerAsync();

W pierwszej lini tworzony jest nowy wątek, później ustawiana jest właściwość umożliwiająca korzystanie z funkcji CancelAsyns, 3 linia jest dla mnie nie jasna, tzn w tym miejscu rodzą się moje wątpliwości a 4 uruchamia wątek. Kod ten to fragment większości, chodzi o serwer który dla każdego nowego połączenia tworzy osobny wątek. I w zasadzie niby wszystko działa, ale co w sytuacji kiedy będę miał np 100 połaczeń i 33 zostanie przerwane, 93 w jeszcze jakiś inny dziwny sposób zostanie utracone. Co stanie się z tymi wątkami? Czuję że w tym momemcie tracę kontrolę nad nimi;).

1

W pierwszej lini tworzony jest nowy wątek - false. Chyba że chodziło o nazwę zmiennej (btw co to za projekt z polskimi nazwami). Nie wątek a kontrolkę - BackgroundWorker. Ona sobie może gdzieś w środku (i robi to) używać wątków, ale dla Ciebie liczy się tylko to że wykonuje operacje asynchroniczne.

2 - true.

3 - Tutaj jest 'przypisywana' praca jaką ma zrobić BackgroundWorker. Sample - http://www.dotneat.net/2009/02/10/BackgroundworkerExample.aspx.
4 - patrz 1.

0

Dzięki za odpowiedź, teraz jest to dla mnie jaśniejsze, ale ciągle się zastanawiam co stanie się kiedy połączenie zostanie utracone. Domyślam się że to powinno zostać przewidziane w watek_DoWork. Ja mam coś takiego:
void watek_DoWork(object sender, DoWorkEventArgs e)
{
IPEndPoint IP = (IPEndPoint)klient.Client.RemoteEndPoint;
SetText(IP.Address.ToString());
SetScroll();
BackgroundWorker bw = (BackgroundWorker)sender;
if (bw.CancellationPending == true)
{
e.Cancel = true;
return;
}
}

0

Dzięki za odpowiedź, teraz jest to dla mnie jaśniejsze, ale ciągle się zastanawiam co stanie się kiedy połączenie zostanie utracone. Domyślam się że to powinno zostać przewidziane w watek_DoWork. Ja mam coś takiego:

void watek_DoWork(object sender, DoWorkEventArgs e)
        {
            IPEndPoint IP = (IPEndPoint)klient.Client.RemoteEndPoint;
            SetText(IP.Address.ToString());
            SetScroll();
            BackgroundWorker bw = (BackgroundWorker)sender;
            if (bw.CancellationPending == true)
            {
                e.Cancel = true;
                return;
            }
        }

Czy to wystarczy?

0

Sprawdzanie czy praca BW ma być przerwana ma sens tak naprawdę w sytuacjach kiedy wszystko wykonuje się w pętli(np. sprawdzać flagę po każdej iteracji), lub całe wykonanie zadania jest długotrwałe(sprawdzać flagę co jakiś czas), więc w twoim przypadku to nie ma sensu, bo i tak robisz to po skończeniu tego co BW miał zrobić.
Co się tyczy błędów/zerwania połączenia, to radziłbym ci dodać obsługę RunWorkerCompleted, który rusza gdy BW zakończy swoją pracę. W RunWorkerCompletedEventArgs masz właściwość Error, dzięki której możesz sprawdzić czy w DoWork nie poleciały jakieś wyjątki: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.runworkercompleted.aspx W związku z tym, że RunWorkerCompleted działa już w wątku głównym możesz bez problemów np. wyrzucić na ekran komunikat o błędzie/zerwaniu połączenia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1