2009-04-20 4 views
10

Chciałbym wiedzieć, jak to jest możliwe, że funkcja C# Invoke można pracować (jestem teraz rozważa połączenie z wątku roboczego do wywołania metody, która manipuluje GUI z wątku GUI):Jak działa Invoke? Czy wątek nie ma tylko jednego wskaźnika instrukcji?

Przyjmijmy, mam dwa wątki, a każdy z nich ma wskaźnik inkrementacji, wskazując na aktualnie wykonywaną instrukcję.

Teraz wywołuję wywołanie w wątku roboczym, aby uruchomić delegata w wątku GUI. W jaki sposób jest to możliwe, gdy wątek GUI ma już wskaźnik instrukcji (IP), a każdy wątek może mieć tylko jeden? Co stanie się z tym adresem IP, gdy nagle wywołam mój kod? Jak to się robi, że wątek GUI może następnie kontynuować z tym, co robił (czy jego poprzedni adres IP zostanie w jakiś sposób przywrócony)?

Uogólnienie to pytanie, jak to się robi, gdy chcę wywołać funkcję f() z gwintem 1 w taki sposób, że f() jest wykonywana w kontekście jakiegoś drugiej wątku ...

Dziękuję za oświecenie :)!

Odpowiedz

10

Wysyła wiadomość okna do docelowego wątku. Wątek musi znajdować się w pętli komunikatów, aby funkcja Invoke mogła działać. Gdy wątek otrzyma wiadomość, wywołuje delegata.

Nie są wymagane żadne zmiany IP w krzyżowej kolejności - w rzeczywistości zmiana adresu IP spowodowałaby niemal natychmiastowe uszkodzenie docelowego wątku.

+2

Odpowiedź jest prawidłowa, ale aby być czystym, jest to komunikat okna, który jest wysyłany, aby po uruchomieniu pompy komunikatów wątków UI otrzymał komunikat i przetworzył go. – Lucero

+0

W rzeczywistości środowisko wykonawcze jest w niektórych sytuacjach w stanie aktywnie uprzedzić działający wątek i zrobić to samo. Nie jestem pewien szczegółów; co najmniej jeden z nich wymaga wywołania śmieci, ale mogą istnieć inne. – Promit

+2

Dziękuję wam obojgu - więc gdy docelowy wątek jest zajęty, metoda może zostać wywołana dopiero po zakończeniu przetwarzania wątku i rozpoczęciu przetwarzania wiadomości. A środkiem do tego jest komunikat Windows z parametrami delegatów w niektórych ładunkach. Dzięki, próbowałem odpowiedzieć w języku angielskim, ale wszędzie było "Tylko dodawaj Invoke, a wszystko będzie dobrze" samouczki ... –

Powiązane problemy