Título: Acceso a un controlador desde otro hilo ? Publicado por: kondrag_X1 en 3 Abril 2015, 16:11 pm Buenas ya se que esta pregunta es genérica y básica pero yo quiero centrarme en la eficiencia y cual es más fácil de entender cuando se relee el código.
en este link podeis encontrar las diferencias: http://www.elguille.info/NET/vs2005/trucos/acceder_a_un_control_desde_otro_hilo.htm (http://www.elguille.info/NET/vs2005/trucos/acceder_a_un_control_desde_otro_hilo.htm) mi cuestión es que he descubierto otra forma y me gustaría una opinion a ver cual les parece más clara y si sabrían decirme a nivel de eficiencia cual es la mejor. mi forma Código: string mensaje = ""; Título: Re: Acceso a un controlador desde otro hilo ? Publicado por: Eleкtro en 3 Abril 2015, 18:38 pm ¿A que diferencia te refieres exactamente?.
En ambos códigos el tuyo y el de aquella url se llama al mismo método 'Windows.Forms.Control.InvokeRequired' y 'Windows.Forms.Control.Invoke', le pasas el delegado y al compilar se generan las mismas instrucciones IL que internamente determinan lo mismo, hallar el handle del control/form para descubrir a que thread pertenece. No hay diferencia alguna en lo que se refiere a eficiencia, tampoco por que le pases un delegado con la referencia del método o una expresión lambda. Ahora, deberías seguir los ejemplos de buenos hábitos, es decir, invocar el control y no el form (aunque eso no afecta para nada al rendimiento pero puede resultar en confusión), y ademas añadir una verificación antes de invocarlo: Ejemplo en VB.Net Código
Traducción online a C#: Código
Si quieres reducir el código para no tener que estar escribiendo siempre lo mismo, puedes desarrollar un método genérico cómo este: Código
Traducción online a C#: Código
Ejemplos de uso en VB.Net Código
Código
Traducción online a C#: Código
Código
Saludos. Título: Re: Acceso a un controlador desde otro hilo ? Publicado por: kondrag_X1 en 5 Abril 2015, 17:09 pm Hola,
muchísimas gracias por tu respuesta, si no entiendo mal la clase Invokerequired e Invoke es lo mismo. Mi pregunta ahora es: El hecho de usar delegados para esta tarea facilita la compresensión del código? Es decir, de los dos métodos el de la página y el mío ¿Cual te costaría menos entender? saludos. Título: Re: Acceso a un controlador desde otro hilo ? Publicado por: Eleкtro en 5 Abril 2015, 17:54 pm si no entiendo mal la clase Invokerequired e Invoke es lo mismo. Para nada, quizás me interpretaste mal, la propiedad InvokeRequired simplemente determina si es necesario llamar al método Invoke (éste comprueba si el control se encuentra en un hilo diferente al actual), y el método Invoke hace el resto, realiza la invocación.Si invocas repetidamente el control desde el hilo que lo creó sin realizar el chequeo con InvokeRequired entonces producirá una (muy ínfima) disminuición de rendimiento. Si estás seguro de que el control siempre va a ser invocado desde un hilo distinto al que lo creó entones no es necesario realizar el chequeo con InvokeRequired pero tampoco está de más conservar los buenos hábitos añadiendo el chequeo. Mi pregunta ahora es: El hecho de usar delegados para esta tarea facilita la compresensión del código? Es decir, de los dos métodos el de la página y el mío ¿Cual te costaría menos entender? Hombre... creo que la comprensión del código depende de las circunstancias y de los gustos de cada uno. Pongo cómo ejemplo este código: Código: sub() En mi opinión no es muy correcto tener un método encapsulado en otro método, pero usar una expresión lamdba ahí a mi me resulta más comprensible que crear el delegado y defnir un método adicional en otra parte del código, por que solamente estoy modificando una propiedad en ese ejemplo y además se que no hay lugar a ninguna posible excepción cross-thread o de otro tipo. Al invocar, yo utilizaría los delegados para reemplazar a una expresión lambda en caso de que tuviese que realizar varias operaciones o en caso de que no estuviese del todo seguro de si pueden producirse excepciones entonces las controlaría en el método del delegado en lugar de en el bloque del lambda por que demasiadas isntrucciones quedaría bastante feo y además el lambda es un método anónimo. Saludos! |