2009-11-15 29 views
6

Yo busco respuestas ya, pero no puedo encontrar nada parecido ...mejor manera de implementar oyente toma en C#

yo soy bastante nuevo en C#. Necesito crear un programa en C# usando WinForms. Básicamente tiene 2 componentes: IU y luego necesito tener un proceso que permanentemente escucha en un puerto TCP de socket. Si hay algo recibido, entonces tengo que plantear un evento o algo similar para poder actualizar la interfaz de usuario.

Pregunta: ¿Cuál es la mejor manera de implementar un proceso que debe estar escuchando todo el tiempo mientras se ejecuta el programa?

Y luego, cuando recibo un mensaje, ¿cómo puedo notificar a la UI que necesita ser actualizado?

Gracias!

Respuesta

1

Puede usar la clase TcpListener. Hay un ejemplo en la documentación.

+0

Creo que están buscando más una respuesta arquitectónica ... parece que no están seguros de cómo integrar un TcpListener con un programa impulsado por eventos. – Polaris878

1

Al iniciar, puede generar (crear) un nuevo subproceso que escuche nuevos mensajes en un bucle infinito. Una vez que se recibe un mensaje, el hilo puede actualizar algún recurso compartido (establecer un marcador). Por supuesto, podrías hacerlo más sofisticado si usaras una cola sincronizada para transferir mensajes. O a través de WCF (aunque esto parece excesivo para sus propósitos).

1

Esto puede no ser la mejor manera de hacer esto, pero debería funcionar ...

Se podría lanzar su código de escucha TCP en un nuevo hilo cuando el programa se inicia ... De esta manera tienes la TCP escuchar código mientras la UI está apagada haciendo otras cosas. Cuando sucede algo en el subproceso TCP, debe señalar el subproceso de interfaz de usuario por algún tipo de evento o cola de eventos.

Ahora, en términos de actualización de un objeto WinForms cuando se recibe algo, creo que solo el hilo que creó el control WinForms puede actualizar los controles. Entonces, tendrás que tener eso en cuenta también.

Este es un problema con el que he luchado antes también ... En mi proyecto actual, hago lo que mencioné anteriormente ... sin embargo, hay bastante sincronización de subprocesos para que funcione.

+2

Es bastante fácil actualizar la UI desde otra secuencia: solo necesita usar el método Control.Invoke pasándole un delegado que actualiza la interfaz de usuario –

8

Puede usar un TcpListener que espera conexiones entrantes en otro hilo. Cada vez que reciba una nueva conexión, cree un nuevo hilo para procesarla. Use Control.Invoke para actualizar la UI del subproceso no relacionado con la interfaz de usuario. Aquí hay un pequeño ejemplo:

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

¿Por qué he votado negativamente? Por favor comenta ! Estoy abierto a la crítica, pero si no sé cuál es el problema con mi respuesta, no es muy constructivo ... –

+0

Es sólo cosméticos, pero creo que tienes un punto y coma demasiado después de esto. Invocar (...) ;; (Solo para aclarar, esa no es la razón por la que fue votado negativamente, al menos no por mí) – Manu

Cuestiones relacionadas