Invoke w wątkach.

0

Witam

Może mi ktoś wytłumaczyć lub zapodać jakiś link gdzie wytłumaczone jest jak używać invoke? Nie chodzi nawet o sam kod, ale podejście teoretyczne do tematu. Z tego co zrozumiałem do tej pory, używamy go by zabezpieczyć program przed występowaniem błędów, które mają miejsce podczas korzystania przez wątki z tych samych danych lub gdy istnieją pomiędzy nimi zależności czasowe. Ale czy to wszystko, lub w ogóle o to chodzi?
Będę wdzięczny za kilka słów wyjaśnienia w tym temacie.

Pozdrawiam

1

Teoretycznie, aby wywołanie wykonało się w kontekście odpowiedniego wątku (niekonieczie tego w którym jesteśmy).
Często takie pytania są w kontekście winforms i odświeżania kontrolek z innych wątków. Elementy gui mogą być modyfikowane przez wątek główny. Wątek główny w winforms odpowiada za rysowanie. Więc jeśli z innego wątku chcesz modyfikować gui musisz wywołać Control.Invoke, aby wykonać procedurę w kontekście wąku, który jest właścicielem kontrolki (wątek główny gui).

0

Hehehe fajnie, a tak na chłopski rozum? Znaczy, że Invoke służy do bezawaryjnego korzystania z zasobów innego wątku?

1
Robster napisał(a)

Znaczy, że Invoke służy do bezawaryjnego korzystania z zasobów innego wątku?

To mocne uproszczenie, bo co znaczy bezawaryjne i zasoby?
Bezawaryjność zapewnia programista, bo to że za pomocą Invoke wywołałeś jakąć funkcję w kontekście innego wątku, to nie znaczy że zadziała ona prawidłowo.
Nie wiem co masz na myśli zasoby innego wątku. Ale są inne metody, które pozwalają na bezpieczny dostęp do np. danych innych wątków, czyli wartości jakiś zmiennych, czy nawet ich modyfikację. M.in. semafory, mutexy i inne tworzy używane w programowaniu równoległym.
Może dokładniej napisz o co ci chodzi? Czy chodzi ci o komunikację między wątkami i o tzn. thread-safe? Czy o użycie Control.Invoke? Bo to trochę inne sprawy.

0

Pisząc wspólne zasoby miałem na myśli tablicę znajdującą się w pewnej klasie i dwa wątki które z niej korzystają, modyfikując jej wartości.
A o użycie Invoke, chodzi mi ogólnie. Nigdzie nie ma wyjaśnienia teoretycznego do tej metody, jest pokazane jej zastosowanie, ale nigdzie nie pisze co ona konkretnie robi, można się tylko domyślać.
Choćby w takiej postaci:

this.Invoke((MethodInvoker)delegate() 
{
...
}
1

I jakbyś od razu napisał o co ci chodzi, to nie pytałbyś o głupoty :)
Najprościej w .net aby mieć synchroniczny dostęp do jakiegoś zasobu przez kilka wątków możemy użyć lock, ważne aby używać tego samego obiektu w lock (musi to być typ referencyjny). W przypadku tablicy, można użyć po prostu tej tablicy.

// gdzieś mamy
int[] tab = new int[100];

// wątek 1
lock(tab)
{
  if (tab[1] > 5)
    tab[3] = 1;
}

// wątek 2
lock(tab)
{
  if (tab[2] > 5)
    tab[3] = 2;
}

Generalnie tobie chodzi o synchronizację dostępu do zasobów, a to nie jest kwestia, którą zajmuje się Control.Invoke. Ta metoda daje ci możliwość użycia zasobu (odwołanie do kontrolki) w kontekście odpowiedniego wątku, ale to w żaden sposób nie synchronizuje dostępu do tego zasobu. W tym celu używa się koncepcji sekcji krytycznej. A osiąga przez lock, semafory, mutexy, ...

1

Przede wszystkim trzeba rozróżnić kilka rzeczy:

Delegate.Invoke - powoduje wykonanie delegata w bieżącym wątku
Control.Invoke - powoduje wykonanie metody w wątku GUI (głównym)

A zatem są to kompletnie 2 różne metody, a wykonanie metody "w kontekście innego wątku" - czyli użycie SynchronizationContext jest możliwe tylko w przypadku kontrolek (WinForms). Te właśnie dzięki metodzie Invoke mają obsługę kolejki wiadomości, a twoje wykonanie spowoduje dodanie elementu do tej kolejki.

Oczywiście możliwe jest stworzenie własnej klasy SynchronizationContext, ale to wykracza raczej poza ramy podstaw.

A więc, odpowiadając na twoje pytanie, cała magia jest zaimplementowana w kontrolkach (nie w samym języku C#, CLR itd).

A jeśli pytasz o synchronizację wątków, to polecam mój artykuł: Bezpieczny dostęp do danych

0

No ale ja nie pytam o synchronizacje, tylko o znaczenie Invoke w programowaniu w ogóle. Zaznaczyłem na początku, że wydaje mi się, że służy do synchronizacji wątków, ale wychodzi na to, że jest to tylko po to by kod poprawnie wykonał się w aplikacji wielowątkowej.

Dzięki za pomoc :)


@Deti dla mnie to jednak czarna magia :/ Muszę jakąś ciekawą książkę dorwać o programowaniu wielowątkowym bo tymi kursikami w sieci to do niczego nie dojdę.

Dzięki za odpowiedz.


Tyle o watkach stron przeszukałem, a tutejszego kursu nie znalazłem :/ Dzięki jeszcze raz.

0
Robster napisał(a)

Tyle o watkach stron przeszukałem, a tutejszego kursu nie znalazłem :/ Dzięki jeszcze raz.

Spróbuj przejrzeć to http://www.albahari.com/threading/

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