Jak rozwiązać problem przesyłania informacji między wątkami? Np mam wątek główny i wątek drugi, w którym chciałbym wykonywać wszystkie operacje sieciowe (żeby się interfejs nie zacinał). I teraz użytkownik klika w button połączenia- startuje wątek drugi, gdzie na początku łączę się z serwerem. Później klika w inny button, po czym muszę coś wysłać do serwera. Jak o tym drugim naciśnięciu poinformować drugi wątek?
1
0
Do głowy przychodzą mi 2 pomysły:
- Prostszy: zmienna boolowska
bool button1clicked = false;
W zdarzeniu kliknięcia przycisku
button1clicked = true;
Wątek obsługiwany byłby przez odpowiednią pętlę:
while(true){
if(button1clicked) FunkcjaObslugiKliknieciaButton1();
if(...) ...; //i inne zdarzenia tak samo
...
System.Threading.Thread.Sleep(100); //nie przemęczać procesora
}
- Trudniejszy: Kolejka poleceń
class Polecenie {} //a w niej potrzebne informacje
public Queue<Polecenie> polecenia = new Queue<Polecenie>();
W zdarzeniu kliknięcia przycisku
polecenia.Enqueue(new Polecenie(...)); //w konstruktorze można podać szczegóły polecenia
Wątek obsługiwany byłby przez odpowiednią pętlę:
while(true){
if(polecenia.Count!=0) polecenia.Dequeue().Run(); //wywołać funkcję Run() klasy polecenie dla danego zadania
System.Threading.Thread.Sleep(100); //nie przemęczać procesora
}
Metoda 2 wymagała by dodatkowej synchronizacji kolejki, ale jest bardzo uniwersalna i daje duże możliwości
0
Zrobiłem sposobem podobnym do pierwszego.