2009-11-15 20 views
6

Poszukałem już odpowiedzi, ale nie mogę znaleźć niczego podobnego ...Najlepszy sposób na wdrożenie nasłuchującego nasadki w C#

Jestem całkiem nowy w C#. Potrzebuję utworzyć program w języku C# przy użyciu WinForms. Zasadniczo ma 2 komponenty: interfejs użytkownika, a następnie muszę mieć proces, który stale nasłuchuje na porcie TCP gniazda. Jeśli coś zostało odebrane, muszę podnieść wydarzenie lub coś podobnego, aby zaktualizować interfejs użytkownika.

Pytanie: Jaki jest najlepszy sposób wdrożenia procesu, który musi być cały czas słuchany, gdy program jest uruchomiony?

A następnie, kiedy otrzymam wiadomość, w jaki sposób mogę powiadomić UI, że potrzebuje aktualizacji?

Dzięki!

Odpowiedz

1

Można użyć klasy TcpListener. W dokumentacji znajduje się przykład.

+0

Uważam, że szukają bardziej architektonicznej odpowiedzi ... wydaje się, że nie są pewni, jak zintegrować TcpListener z programem sterowanym zdarzeniami. – Polaris878

1

Przy uruchomieniu możesz odrodzić (stworzyć) nowy wątek, który będzie słuchał nowych wiadomości w nieskończonej pętli. Po otrzymaniu wiadomości wątek może zaktualizować niektóre zasoby udostępnione (ustawić flagę). Oczywiście możesz uczynić to bardziej wyrafinowanym, jeśli używasz zsynchronizowanej kolejki do przesyłania wiadomości. Lub poprzez WCF (nawet jeśli wydaje się to przesadne dla twoich potrzeb).

1

To może nie być najlepszym sposobem, aby to zrobić, ale to powinno działać ...

Można uruchomić kod słuchacza TCP w nowym wątku po uruchomieniu programu ... W ten sposób masz TCP słuchanie kodu, gdy interfejs jest wyłączony, wykonując inne czynności. Gdy coś dzieje się w wątku TCP, będzie musiało sygnalizować wątek interfejsu użytkownika przez jakieś zdarzenie lub kolejkę zdarzeń.

Teraz, jeśli chodzi o aktualizowanie obiektu WinForms po otrzymaniu czegoś, wierzę, że tylko wątek, który utworzył formant WinForms, może zaktualizować formanty. Musisz to również wziąć pod uwagę.

Z tym problemem też się zmagałem ... W moim bieżącym projekcie robię to, o czym wspomniałem powyżej ... jednak jest dość sporo synchronizacji wątku, aby to działało.

+2

Aktualizacja interfejsu użytkownika z innego wątku jest łatwa: wystarczy użyć metody Control.Invoke, przekazując mu delegata aktualizującego interfejs użytkownika –

8

Możesz użyć TcpListener, który czeka na połączenia przychodzące w innym wątku. Za każdym razem, gdy otrzymasz nowe połączenie, utwórz nowy wątek, aby go przetworzyć. Użyj Control.Invoke, aby zaktualizować interfejs użytkownika z wątku innego niż interfejs użytkownika. Oto krótki przykład:

public MainForm() 
{ 
    InitializeComponents(); 
    StartListener(); 
} 

private TcpListener _listener; 
private Thread _listenerThread; 

private void StartListener() 
{ 
    _listenerThread = new Thread(RunListener); 
    _listenerThread.Start(); 
} 

private void RunListener() 
{ 
    _listener = new TcpListener(IPAddress.Any, 8080); 
    _listener.Start(); 
    while(true) 
    { 
     TcpClient client = _listener.AcceptTcpClient(); 
     this.Invoke(
      new Action(
       () => 
       { 
        textBoxLog.Text += string.Format("\nNew connection from {0}", client.Client.RemoteEndPoint); 
       } 
      ));; 
     ThreadPool.QueueUserWorkItem(ProcessClient, client); 
    } 
} 

private void ProcessClient(object state) 
{ 
    TcpClient client = state as TcpClient; 
    // Do something with client 
    // ... 
} 
+0

. Dlaczego odrzucono ofertę? Proszę skomentuj ! Jestem otwarty na krytykę, ale jeśli nie wiem, co jest nie tak z moją odpowiedzią, nie jest to zbyt konstruktywne ... –

+0

To tylko kosmetyki, ale myślę, że za dużo już masz średnika. Invoke (...) ;; (Tylko po to, by wyjaśnić, to nie jest powód, dla którego odrzucono Cię, a przynajmniej nie przeze mnie) – Manu

Powiązane problemy