Akcje między wątkami.

0

Cześć zaczynam przygodę z c# i .net i mam pewien problem. Otóż potrzebuje się dostać do kontrolki z wątka głównego z wątku utworzonego. Wiem, że można to sychronizować po zatrzymaniu ale taka opcja mi nie odpowiada.

Stworzyłem wątek do nasłuchu po sieci, który chodzi nonstop i odbiera, teraz od czasu do czasu chciałbym po otrzymaniu komunikatu uaktualnić textbox z wątka głównego. Jak to rozwiązać nie stopując? Utworzyć kontrolkę Od razu w wątku z siecią, wtedy by pewnie poszło ale nie miałby dostępu z wątka głównego? Czytałem też, żeby użyć Invoke na delegatach, ale za bardzo mi to nic nie mówi i nie mogę znaleŹć prostego przykładu, który pomógł by mi to zrozumieć.

0

Z poziomu wątku:

if (InvokeRequired) Invoke((MethodInvoker)(() => { textBox.Text += "dupa"; }));
2

if (InvokeRequired) Invoke((MethodInvoker)(() => { textBox.Text += "dupa"; }));

A jak nie będzie "required"? :-)

Żeby dwa razy kodu nie pisać, wzorzec jest mniej-więcej taki:

void ZróbCoś()
{
   if (InvokeRequired)
      Invoke(ZróbCoś);
   else
   {
      textBox.Text += "dupa";
      // ... reszta
   }
}

Invoke odpali jeszcze raz tę samą metodę, ale już nie będzie "invoke required" i wykona się kod po else.

0

No albo wydzielić powtarzający się kod do nowej metody i dodać ifa w tym co napisałem. Ale cos mi sie wydaje, że to nie wyjasni autorowi pytania jak to działa, co najwyżej skopiuje to do siebie ale nie będzie wiedział czemu tak to musi być.

0

Jest jeszcze (jako ciekawostka bardziej, bo to raczej mało eleganckie rozwiązanie :))

CheckForIllegalCrossThreadCalls = false;
0

To nie jest żadne rozwiązanie.

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