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?
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.
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);
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.
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.
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.
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