Usando OpenNETCF.Net.Ftp dentro de una clase en lugar de en el interior de un formulario Windows

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

  •  23-08-2019
  •  | 
  •  

Pregunta

Hasta ahora estoy usando un objeto de FTP dentro de un formulario de Windows. objeto de FTP se ejecuta en un hilo separado, de modo de asegurar que mi aplicación no se congela, yo utilizo el siguiente fragmento de código:

private void OnResponse(string response)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new StringDelegate(OnResponse), new object[] { response });
            return;
        }
    } //end of OnResponse

No estoy del todo claro en lo que un delegado de la cadena es, pero esto funciona.

Sin embargo, ahora estoy refactorización y deseo de ocultar el ftp en una clase. Mi pregunta es ¿cómo puedo hacer que el hilo principal no se congela? Todas las referencias en línea con respecto a eventos de recaudación dentro de las clases tienen sentido, pero no he encontrado ni un solo ejemplo en el que es multiproceso la aplicación. Mi mayor preocupación sería InvokeRequired.

En el código anterior esta es una forma. Si oculto el objeto ftp dentro de una clase como la siguiente:

abstract class MyClass
{
    //data members
    private FTP _ftp;

    //other data members, methods, and properties etc
}

"Este" se convierte en un objeto de MiClase. No estoy seguro de si la propiedad InvokeRequired se implementa en la clase (tal vez debería hacer que implementar una interfaz especial que tiene esa propiedad?). O tal vez me estoy perdiendo algo y no se supone que utilice objetos multiproceso dentro de las clases?

¿Fue útil?

Solución

Es necesario un control o algo derivado de control (no tiene que ser un formulario) que se creó en el subproceso de interfaz de usuario. Sus MiClase probable es que no se deben actualizando la interfaz de usuario directamente, así que no es realmente relevante aquí - MiClase probablemente provocar un evento o invocar una devolución de llamada.

Cuando se vuelve importante es arriba en la interfaz de usuario cuando se quiere cambiar algo en un formulario basado en un suceso procedente de la biblioteca de FTP. Para eso se necesita un control o cualquier cosa derivada de control (de nuevo, no tiene por qué ser un formulario) que se creó en el subproceso de interfaz de usuario. Utilizar ese control para comprobar InvokeRequired, y si es verdad, llamar a Invoke. El original utiliza un delegado personalizado (probablemente proviene de la muestra FTP, ya que se ve muy familiar para mí), pero se puede usar cualquier delegado que desee.

Hay un montón de ejemplos en la web para el uso de Control.Invoke, por lo que deben ser capaces de conseguirlo implementado con bastante facilidad.

Otros consejos

La forma más probable para diseñar este es dejar que la persona que llama de Invoke 'MiClase' Invocar o no, según sea necesario. Me gustaría diseñar su clase para disparar un evento cuando ocurre la respuesta.

Recuerde que es único código que interactúa con la interfaz de usuario de Windows que necesita ser Invoke-d en el hilo principal. Cualquier otro tipo de manipulación en OnResponse puede hacerse en el fondo hilo ningún problema.

Si su 'MiClase' no una ventana de objeto como una forma o de control es, entonces usted no tiene el InvokeRequired al igual que lo dicho. Pero lo que no necesita InvokeRequired. Si alguna otra clase que representa un objeto de interfaz de usuario no necesita hacer algo en respuesta al objeto de FTP, así que objetos de interfaz de usuario puede hacer la prueba InvokeRequired.

Espero que eso está claro!


EDIT: información addl

El manejador OnReceived sería definitivamente en su clase FTP. Así que estoy pensando en algo como esto:

MyFTPClass clase pública    {      evento público manejador de sucesos DataReceived; // la forma de interfaz de usuario puede suscribirse a este evento

 private void OnReceived()
 {
   //so the FTP has returned data
   // Do stuff here that can be on the background thread like saving
   // the file in an appropriate place, or whatever.


   // now trigger the DataReceived event.  Anyone who cares about data being received
   // can subscribe to this and do whatever is appropriate.
   if (DataReceived) DataReceived(this, EventArgs.Empty); 

}

Este es un esbozo. Pero la idea básica es que se haga lo que pueda localmente en el hilo de fondo. A continuación, puede notificar a la interfaz de usuario a través de un evento.

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