No estoy seguro si estoy usando el "uso" correctamente c# en la aplicación tftp

StackOverflow https://stackoverflow.com//questions/25070454

  •  26-12-2019
  •  | 
  •  

Pregunta

Estoy tratando de utilizar este pre-hechos en C# tftp servidor de aplicación con mi windows c# forma.En los autores del servidor de ejemplo, que las grandes obras, se utiliza una aplicación de consola.Cuando estoy tratando de portar su ejemplo de la consola en mi forma de app no funciona (no hay ningún error, simplemente no se conecta) y creo que mi problema está en el "uso" de la declaración:

using (var server = new TftpServer())
{
    server.OnReadRequest += new TftpServerEventHandler(server_OnReadRequest);
    server.OnWriteRequest += new TftpServerEventHandler(server_OnWriteRequest);
    server.Start();
    Console.Read();
}

No estoy seguro si he entendido bien pero creo que la Console.Read() bloques de mantenimiento de la aplicación a partir de la salida.Si este es el caso, ¿cómo puedo implementar un equivalente con un formulario de aplicación.Simplemente no puedo conseguir mi cabeza alrededor de la "utilización".Lo siento soy nuevo en c#.

¿Fue útil?

Solución

Los Formularios Windows forms siempre permanecerán abiertos hasta que explícitamente se cierra por el usuario.Siempre tienen un hilo de leer el mensaje de la cola de la entrada del usuario, para que no se salga de la misma forma que un desenfrenado aplicación de consola.En Windows Forms, tenemos que preocupar un poco más sobre el multithreading y de la simultaneidad de lo que sería en la consola de aplicaciones.Que en su mayoría viene de forma natural, pero no siempre.

Debido a eso, realmente no se puede utilizar un equivalente a Console.Read() para mantener a raya a la ejecución de la using disposición hasta que el usuario lo solicita.Si no, su forma de simplemente aparecer no responde.

Sin embargo, estás de suerte!Un using bloque en C# no es más que azúcar sintáctico para recordar a llamar IDisposable.Dispose() después de que hayas terminado con un objeto.Por lo que el equivalente a este en un proyecto de Formularios que sólo se podría almacenar la server objeto en una clase-ancho de campo, a continuación, llamar a server.Dispose() en, digamos, un Button.Click evento.Eso es, por supuesto, sólo un ejemplo.Usted también podría hacerlo en Form.Closing si que se sentía más apropiado.

De alto nivel, que quiere hacer algo como esto:

  1. Declarar un campo en la clase de formulario TftpServer server;.
  2. El registro de un Load evento y todo lo que necesita para su server para funcionar en el constructor.
  3. Abra su server campo en el Form_Load evento.
  4. El uso de la server's eventos como se puede ver en muy buena forma durante la vida de su Form.Usted puede o no tiene que preocuparse acerca de la concurrencia, pero eso es un asunto para otra pregunta.
  5. Llame server.Dispose() en el formulario Dispose evento.

En esencia,

class main : Form
{
    private TftpServer server;

    public main()
    {
        InitializeComponent();

        this.Load += main_Load;

        server = new TftpServer();
        server.OnReadRequest += new TftpServerEventHandler(server_OnReadRequest);
        server.OnWriteRequest += new TftpServerEventHandler(server_OnWriteRequest);
    }

    private void main_Load(object sender, EventArgs e)
    {
        server.Start();
    }

    private void server_OnReadRequest(/* I wasn't sure of the arguments here */)
    {
        // use the read request: give or fetch its data (depending on who defines "read")
    }
    private void server_OnWriteRequest(/* I wasn't sure of the arguments here */)
    {
        // use the write request: give or fetch its data (depending on who defines "write")
    }

    protected override void Dispose(bool disposing)
    {
        if (server != null) // since Dispose can be called multiple times
        {
            server.Dispose();
            server = null;
        }
    }
}

Otros consejos

El problema es que desechar el servidor es lo que es el cierre.Tenga en cuenta el uso es sólo azúcar sintáctico.El siguiente código de dos trozos son [prácticamente] equivalente:

var foo = new Foo();
try
{
   foo.Do();
}
finally
{
   foo.Dispose();
}

using (var foo = new Foo())
{
   foo.Do();
}

Están bien bloquear el hilo principal a partir de la salida en una aplicación de Consola, pero en una aplicación de Formularios es diferente.El problema no es que usted necesita para mantener el hilo en el interior de la utilización por hacer algún tipo de operación de bloqueo.Eso sería malo, y el comportamiento de bloqueo de seguridad de sus formas de aplicación.El problema es que usted no desea utilizar el uso.Quieres nuevo, es cuando se inicia el servidor y, a continuación, más tarde, al salir de la aplicación, o en una parada clic, eliminar explícitamente con Dispose().

En una aplicación de consola de su TftpServer escucha la instancia hasta que el hilo sale que es sólo después de que se presiona una tecla que es detectado por Console.Read()

En los formularios de la aplicación que Console.Read() no está esperando y por lo que el using bloque de acabados y que hace que la instancia del servidor de caer fuera de alcance.

Por lo que no son exactamente el mal uso de los using pero en lugar de la intención de uso no te va a ayudar en todo.Echa un vistazo a el uso de la task parallel library dejar algunas tareas en segundo plano para ejecutar de forma asincrónica.

Una pequeña nota, que también se dobla como una respuesta, podría el uso de un bloque using aquí, usted acaba de poner en su función principal:

...(make your form and stuff) 
using (var server = new TftpServer())
{
   server.OnReadRequest += new TftpServerEventHandler(server_OnReadRequest);
   server.OnWriteRequest += new TftpServerEventHandler(server_OnWriteRequest);
   server.Start();
   Application.Run(yourFormHere); //This blocks until the form is closed
}

Otra opción que se me olvidó mencionar es primordial Disponer en su Forma.Usted probablemente querrá hacer esto.Con esta opción te garantizan que tu servidor serán eliminados (barra de algún evento que le impedirá ser eliminados de cualquier manera [es decir.estar fuera de la memoria])

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top