Proszę o wytłumaczenie działania i użycia delegatów

0

Mam kod który napisałem za pomocą internetu i chciałbym wiedzieć jak on działa.

 
private delegate void Delegacja();

        public int loadTree(TreeView tree, string filename)
        {
         ....
                foreach (TreeNode node in nodeList)
                {
                    tree.Invoke((dalegat)delegate{
                    tree.Nodes.Add(node);
                    });
                }
       }

albo

 
        private delegate void Delegacja();
        public void InvokeIfRequired(Control control, Action action) //dodanie kat do treeView1
        {
            
            if (this.progressBar1.InvokeRequired)
            {
                progressBar1.Invoke((Delegacja)delegate
                {
                    this.progressBar1.Value += 1;
                    if (progressBar1.Value == 23570)
                    {
                        progressBar1.Visible = false;   
                    }
                });
            }

            if (control.InvokeRequired)
                control.Invoke(action);
            else
                action();
        }
1

Zacznij od rozróżnienia delegatów od lambd (owszem dosyć często występują razem) oraz zagadnień Invoke.
Delegaty można opisać jako lista wskaźników do metod, podpinamy jeden lub więcej wskaźników a później razem je odpalamy (w podanych wyżej przykładach lista składa się z jednej metody).

0

Pamiętam że pisałem Ci metodę InvokeIfRequried, coś ty z nią zrobił?
Nie powinieneś ruszać tej metody, a jeśli chcesz zaktualizować progressbar czy cokolwiek innego to robisz to tak:

        void UpdateProgressBar()
        {
            InvokeIfRequired(progressBar1, new Action(() =>
            {
                this.progressBar1.Value += 1;
                if (progressBar1.Value == 23570)
                {
                    progressBar1.Visible = false;
                }
            }));
        }

        public void InvokeIfRequired(Control control, Action action)
        {
            if (control.InvokeRequired)
                control.Invoke(action);
            else
                action();
        }
0

@dam1an, czemu nie zrobić to po ludzku?

        void UpdateProgressBar()
        {
            InvokeIfRequired(progressBar1, delegate { progressBar1.Visible = (++progressBar1.Value < 23570); });
        }
0

Może ten link coś Ci rozjaśni. Moim zdaniem całkiem fajnie wytłumaczone.
http://www.cezarywalenciuk.pl/post/2011/07/10/Kurs-Obiektowosc-w-C-Delegaty-18.aspx

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