Korzystanie Z C# MethodInvoker.Invoke () dla aplikacji GUI ... czy to dobrze?

Używając C# 2.0 i delegata MethodInvoker, mam aplikację GUI odbierającą jakieś zdarzenie z wątku GUI lub z wątku roboczego.

Do obsługi zdarzenia w formie używam następującego wzoru:

private void SomeEventHandler(object sender, EventArgs e)
{
    MethodInvoker method = delegate
        {
            uiSomeTextBox.Text = "some text";
        };

    if (InvokeRequired)
        BeginInvoke(method);
    else
        method.Invoke();
}

Używając tego wzorca nie powielam rzeczywistego kodu UI, ale nie jestem pewien, czy ta metoda jest dobra.

W szczególności linia

method.Invoke()

Czy używa innego wątku do wywołania, czy przekłada się nieco na bezpośrednie wywołanie metody w wątku GUI?

Author: Kent Boogaart, 2009-04-23

5 answers

Wywołanie method.Invoke() wykonuje delegata w bieżącym wykonującym wątku. Użycie BeginInvoke(method) zapewnia, że delegat zostanie wywołany w wątku GUI.

Jest to prawidłowy sposób unikania powielania kodu, gdy ta sama metoda może być wywołana zarówno z wątku GUI, jak i innych wątków.

 21
Author: CMerat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-23 15:33:27

Osobiście lubię tę metodę:

private void ExecuteSecure(Action a)
{
    if (InvokeRequired)
        BeginInvoke(a);
    else
        a();
}

I wtedy możesz napisać jednolinijkowe TAK:

ExecuteSecure(() => this.Enabled = true);
 14
Author: Stephan Ryer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-09 07:41:03

Pamiętaj, że kontrola.InvokeRequired zwraca false, jeśli znajdujesz się w wątku tła i kontrolce.Ishandle created jest fałszywe. Zabezpieczyłbym kod Debugiem.Zapewnia, że sprawdza tworzenie niezarządzanego uchwytu.

 5
Author: GregC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-28 18:01:03

Dla WinForms, wywołanie Control.Invoke(Delegate) wysyła wiadomość do pompy komunikatów THEAD. Następnie wątek przetwarza wiadomość i wywołuje delegata. Po przetworzeniu Invoke przestaje blokować, a wywołujący wątek wznawia uruchamianie kodu.

 2
Author: Samuel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-23 15:37:19

Wywołuje w tym samym wątku. Możesz sprawdzić, przechodząc przez kod. Nie ma w tym nic złego.

 0
Author: Nick Whaley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-23 15:32:28