Documentos de Académico
Documentos de Profesional
Documentos de Cultura
NET
ndice Descripcin Descripcin de los componentes Creacin de componentes con servicio Demostracin: creacin de un componente con servicio Creacin de clases de componentes Demostracin: Creacin de un componente Stopwatch Creacin de controles de formularios Windows Forms Demostracin: Creacin de una caja de texto mejorada Manejo de hilos de ejecucin Demostracin: Uso de la instruccin SyncLock 1 2 11 29 31 37 39 46 48 61
Descripcin
Objetivo
Presentar los temas y objetivos del mdulo.
Presentacin
Components Overview Creating Serviced Components Creating Component Classes Creating Windows Forms Controls Creating Web Forms User Controls Threading
Como desarrolladores de Microsoft Visual Basic, seguramente ya sabemos cmo desarrollar y utilizar componentes en nuestras aplicaciones. En Visual Basic .NET, podemos utilizar las nuevas caractersticas en tiempo de diseo para crear fcilmente componentes y extender sus funcionalidades. En este mdulo, aprenderemos a: Describir los distintos tipos de componentes que pueden crearse en Visual Basic .NET. Crear componentes que pueden ser utilizados por aplicaciones cliente gestionadas y no gestionadas. Crear componentes con servicio Crear clases de componentes Crear controles de formularios Windows Forms. Utilizar hilos para crear aplicaciones con mltiples hilos de ejecucin.
Tipos de componentes Uso d mdulos como componentes Uso de clases como componentes Uso de componentes en aplicaciones cliente no gestionadas Descripcin de .NET Remoting
Presentacin
Esta leccin explica los tipos de componentes que podemos crear en una aplicacin basada en Visual Basic .NET y cmo podemos hacerlos visibles para aplicaciones cliente no gestionadas. Tambin proporciona una descripcin de .NET Remoting para la comunicacin entre componentes.
En Visual Basic .NET, podemos crear varios tipos de componentes accesibles tanto desde aplicaciones cliente gestionadas (las basadas en los servicios del entorno de ejecucin del .NET Framework) y aplicaciones cliente no gestionadas (por ejemplo, las creadas en Visual Basic 6.0). En esta leccin, aprenderemos a: Describir los tipos de componentes que podemos crear en Visual Basic .NET. Utilizar mdulos y clases como componentes. Utilizar componentes basados en Visual Basic .NET en entornos no gestionados. Explicar los principales conceptos de .NET Remoting.
Tipos de componentes
Objetivo
Explicar los diferentes tipos de componentes que podemos crear en Visual Basic .NET.
Estructuras Mdulos Clases Clases de componente Componentes con servicio Controles de usuario Controles de usuario de formularios Windows Forms Controles de usuario de formularios Web Forms
Presentacin
Podemos crear varios tipos de componentes en una aplicacin basada en Visual Basic .NET.
En Visual Basic .NET, podemos crear varios tipos de componentes distintos, incluyendo: Sugerencia Estructuras Mdulos Clases Clases de componentes Componentes con servicio Controles de usuario
Comentar que este mdulo se centra en cmo crear y utilizar clases de componentes, componentes con servicio y controles de usuario. El resto de tipos de componentes se mencionan nicamente como referencia.
Estructuras
Podemos utilizar las estructuras como componentes declarndolas pblicas cuando las definamos. Las estructuras soportan muchas de las caractersticas de las clases, incluyendo propiedades, mtodos y eventos, pero son de tipo valor; por tanto, la gestin de la memoria es ms eficaz. Las estructuras no soportan herencia.
Mdulos
Podemos utilizar los mdulos como componentes declarndolos pblicos cuando los definamos. Declarar mdulos pblicos permite crear libreras de cdigo que contienen rutinas tiles para mltiples aplicaciones. Tambin podemos utilizar mdulos para crear funciones reutilizables que no son de aplicacin a un componente, clase o estructura concretos. Si hemos utilizado las clases GlobalMultiUse o GlobalSingleUse en versiones anteriores de Visual Basic, el concepto de librera de cdigo no nos resultar nuevo. Estas clases proporcionan la misma funcionalidad en Visual Basic .NET; el cdigo cliente no necesita cualificar estas clases por el nombre de clase para invocar las funciones.
Clases
Podemos utilizar clases como componentes declarndolas pblicas en un ensamblado. Podemos utilizar clases pblicas desde cualquier aplicacin cliente basada en .NET agregando una referencia al ensamblado del componente. Podemos extender la funcionalidad de las clases mediante mecanismos como propiedades, mtodos y eventos. Las clases tambin son extensibles mediante la herencia, lo cual permite a las aplicaciones reutilizar la lgica existente en estos componentes.
Clases de componentes
Una clase se convierte en componente cuando se ajusta a un estndar para la interaccin con componentes. Este estndar se proporciona a travs de la interfaz IComponent. Cualquier clase que implemente la interfaz IComponent es un componente. Las clases de componentes permiten abrir la clase en un diseador visual y permiten a la clase ser ubicada en otros diseadores visuales.
Controles de usuario
Los controles de usuario son componentes creados por un desarrollador para ubicarlos en formularios Windows Forms o Web Forms. Cada control de usuario tiene su propio conjunto de propiedades, mtodos y eventos que lo hacen adecuado para un determinado uso. Podemos manipular controles de usuario en los diseadores de formularios Windows Forms y Web Forms y escribir cdigo para agregar controles de usuario dinmicamente en el entorno de ejecucin, al igual que con los controles proporcionados como parte del .NET Framework. Nota En este mdulo, aprenderemos cmo crear y utilizar clases de componentes, componentes con servicio y controles de usuario.
Presentacin
En Visual Basic .NET, podemos utilizar mdulos como componentes fuera del ensamblado en el que estn definidos.
En Visual Basic .NET podemos utilizar mdulos como componentes fuera del ensamblado en el que estn definidos. Para que esto sea posible, debemos declarar el mdulo como pblico cuando lo definamos. A continuacin, necesitaremos crear una referencia en el ensamblado cliente al ensamblado componente y utilizar la instruccin Imports para permitir el acceso a los mtodos del mdulo. El siguiente ejemplo muestra cmo crear un mdulo pblico denominado MyMathFunctions que define la funcin Square. Este mdulo est definido en el ensamblado MyAssembly. A continuacin, el mdulo puede utilizarse como un componente en el cdigo cliente, como muestra la segunda parte del ejemplo.
Public Module MyMathFunctions Public Function Square(ByVal lng As Long) As Long Return (lng * lng) End Function ... End Module 'Client code Imports MyAssembly ... Dim x As Long = Square(20)
Presentacin
Podemos utilizar clases como componentes fuera del ensamblado en el que estn definidas marcando la clase como pblica. A continuacin, referenciamos el ensamblado del componente desde el ensamblado cliente, y utilizamos la instruccin Imports para permitir el acceso directo a la clase. El siguiente ejemplo muestra cmo crear una clase pblica denominada Account que define los mtodos Debit y Credit. Esta clase est definida en el ensamblado MyAssembly. A continuacin, otro ensamblado cliente referencia el ensamblado, y la clase puede utilizarse por instancias de objetos.
Public Class Account Public Sub Debit(ByVal AccountId As Long, Amount As Double) 'Perform debit action End Sub Public Sub Credit(ByVal AccountId As Long, Amount As Double) 'Perform credit action End Sub End Class 'Client code Imports MyAssembly Dim x As New Account( ) x.Debit(1021, 1000)
Setting assembly properties Generate a strong name Select Register for COM Interop in Build options Exposing class members to COM and Component Services Define and implement interfaces Use the ClassInterface attribute with AutoDual value Use the COMClass attribute
Presentacin
Podemos utilizar COM para que todos los componentes de Visual Basic .NET sean accesibles desde clientes no gestionados, siguiendo unos sencillos pasos.
Podemos crear componentes con Visual Basic .NET que pueden ser utilizados por aplicaciones cliente no gestionadas. Esta interoperabilidad permite utilizar caractersticas de los servicios de componentes como la agrupacin de objetos o las transacciones. Para exponer nuestros componentes a COM y a los servicios de componentes, debemos establecer propiedades especficas del ensamblado y crear nuestras clases adecuadamente.
Una vez generado el archivo de claves, podemos agregarlo al proyecto y referenciarlo en AssemblyInfo.vb utilizando el siguiente cdigo:
<Ensamblado: AssemblyKeyFile("KeyFile.snk")>
De este modo, nuestro ensamblado tendr un nombre seguro la prxima vez que lo generemos.
Compruebe que los estudiantes saben qu son los interfaces duales. Explquelo brevemente si fuera necesario.
10
Cliente AppDomain
Marshal By Reference
Cdigo cliente
Servidor Proxy
Servidor AppDomain
Presentacin
Formateador
Formateador
Objeto servidor
Canal
Marshal By Value
Cdigo cliente
Copia objeto servidor
Formateador
Canal
Canal
Lmite de Remoting
Las versiones anteriores de Visual Basic utilizaban COM y la versin distribuida de COM (DCOM) para comunicarse con componentes en diferentes procesos o con distintos equipos. Visual Basic .NET utiliza .NET Remoting para permitir la comunicacin entre aplicaciones cliente y servidor a travs de dominios de aplicaciones. El .NET Framework proporciona varios servicios que se utilizan en remoto: Los canales de comunicacin son los responsables de transportar los mensajes a y desde aplicaciones remotas utilizando tanto un formato binario sobre un canal Transmission Control Protocol (TCP) como Extensible Markup Language (XML) sobre un canal Hypertext Transfer Protocol (HTTP). Formateadores que codifican y decodifican mensajes antes de que sean transportados por el canal. Objetos proxy que envan las invocaciones de mtodos remotos al objeto adecuado. Soporte para la activacin remota de objetos y para la duracin de objetos marshal-by-reference que se ejecutan en el servidor. Objetos marshal-by-value que son copiados por el .NET Framework en el espacio del proceso en el cliente para reducir viajes de ida y vuelta entre procesos o entre equipos. Nota Si deseamos obtener ms informacin sobre .NET Remoting, consultar Microsoft .NET Remoting: introduccin tcnica en la documentacin de Microsoft Visual Studio .NET.
11
Hospedar componentes en Component Services Uso de transacciones Uso del pooling de objetos Uso de cadenas de constructor Uso de seguridad Uso de otros Component Services configuracin de ensamblados para Component Services
Presentacin
Esta leccin examina componentes .NET hospedados por los servicios de componentes.
En esta leccin, aprenderemos a: Describir los requerimientos para hospedar componentes basados en .NET en una aplicacin de servicios de componentes. Habilitar el procesamiento de transacciones en nuestros componentes. Utilizar la agrupacin de objetos para mejorar el rendimiento de los objetos que necesitan recursos adicionales. Utilizar atributos de seguridad para especificar cmo interactan los componentes con la seguridad de los servicios de componentes. Agregar constructores para controlar la inicializacin de un componente. Explicar cmo utilizar otros servicios de componentes, como la activacin Just-In-Time, desde componentes Visual Basic .NET. Establecer atributos a nivel de ensamblado para mejorar la instalacin de nuestra aplicacin.
12
Agregar una referencia a System.EnterpriseServices en el ensamblado El espacio de nombres System.EnterpriseServices proporciona: Clase ContextUtil Clase ServicedComponent Atributos de ensamblado, clase y mtodo
Presentacin
Para permitir que los componentes sean hospedados en los servicios de componentes, el .NET Framework proporciona varios elementos que necesitamos incluir en nuestros ensamblados y en las clases.
Debemos agregar una referencia en el proyecto al espacio de nombres System.EnterpriseServices si deseamos hospedar un componente Visual Basic .NET en una aplicacin de servicios de componentes. Este espacio de nombres proporciona las principales clases, interfaces y atributos para comunicar con los servicios de componentes. El espacio de nombres System.EnterpriseServices proporciona las siguientes caractersticas:
Caracterstica Clase ContextUtil Uso Esta clase se utiliza para participar en transacciones y para interactuar con informacin de seguridad. La funcionalidad de esta clase es similar a la funcionalidad de la clase ObjectContext en Visual Basic 6.0. Clase Todas las clases de componentes que necesitan ser hospedadas en ServicedComponent una aplicacin de servicios de componentes deben heredar de esta clase. Esta clase define el tipo base para todos los tipos enlazados a contexto e implementa mtodos similares a los que se encuentran en la interfaz IObjectControl utilizada en las aplicaciones de servicios de componentes basadas en Visual Basic 6.0. Atributos de ensamblado, clase y mtodo Podemos definir varios atributos del ensamblado para la interrogacin a los servicios de componentes en el archivo AssemblyInfo.vb. Estos valores se utilizan para establecer el nombre y la descripcin de la aplicacin y dems valores cuando la aplicacin se instala como una aplicacin de servicios de componentes. El espacio de nombres System.EnterpriseServices tambin define varios atributos de clases y mtodos, incluyendo TransactionAttribute, AutoCompleteAttribute, ObjectPoolingAttribute y ConstructionEnabledAttribute.
13
Nota La parte Attribute de un nombre de atributo es opcional, por tanto, por ejemplo, podemos utilizar AutoComplete o AutoCompleteAttribute en nuestro cdigo.
14
Uso de transacciones
Objetivo
Examinar cmo los componentes pueden utilizar transacciones de los servicios de componentes.
El atributo Transaction especifica cmo participa una clase en las transacciones La clase ContextUtil proporciona transaction voting El atributo AutoComplete impide el uso de los mtodosSetAbort, SetComplete y ContextUtil
<Transaction(TransactionOption.Required)> Public Class Account <Transaction(TransactionOption.Required)> Public Class Account Inherits ServicedComponent Inherits ServicedComponent Public Sub Debit(...) Public Sub Debit(...) 'Perform debit action 'Perform debit action ContextUtil.SetComplete( ) ContextUtil.SetComplete( ) End Sub End Sub <AutoComplete( )> Public Sub Credit(...) <AutoComplete( )> Public Sub Credit(...) 'Perform credit action 'Perform credit action 'No SetComplete because AutoComplete is on 'No SetComplete because AutoComplete is on End Sub End Sub End Class End Class
Presentacin
Existen varios objetos y atributos que permiten a los componentes de Visual Basic .NET utilizar transacciones de los servicios de componentes.
Con frecuencia, se requieren transacciones para mantener la integridad de los datos y sincronizar actualizaciones de datos entre mltiples fuentes de datos. Podemos habilitar el procesamiento de transacciones en los componentes con servicio incluyendo las clases y atributos adecuados en el cdigo de nuestro componente.
RequiresNew
Supported
15
SetComplete
EnableCommit
16
Procesamiento de transacciones
Para evitar el uso de los mtodos SetAbort y SetComplete de ContextUtil, podemos establecer el atributo AutoComplete de los mtodos especficos del componente. Si no ocurren excepciones durante la ejecucin del mtodo, el objeto se comporta como si se hubiera invocado SetComplete. Si ocurren excepciones, el objeto se comporta como si se hubiera invocado SetAbort.
17
La agrupacin de objetos permite crear los objetos con antelacin El atributo ObjectPooling especifica MinPoolSize y MaxPoolSize ServicedComponent proporciona el mtodo CanBePooled
<ObjectPooling(Enabled:=True, MinPoolSize:=5, _ <ObjectPooling(Enabled:=True, MinPoolSize:=5, _ MaxPoolSize:=50)> _ MaxPoolSize:=50)> _ Public Class Account Public Class Account Inherits ServicedComponent Inherits ServicedComponent ... ... Protected Overrides Function CanBePooled( ) As Boolean Protected Overrides Function CanBePooled( ) As Boolean Return True Return True End Function End Function End Class End Class
Presentacin
Diversos atributos e interfaces permiten que los componentes de Visual Basic .NET utilicen la agrupacin de objetos.
En Visual Basic .NET, podemos utilizar el atributo ObjectPooling y la clase base ServicedComponent para crear componentes con servicio que utilicen la agrupacin de objetos.
Qu es la agrupacin de objetos?
La agrupacin de objetos permite crear con antelacin un nmero prestablecido de objetos, de modo que estn listos para ser usados por peticiones de clientes cuando la aplicacin se inicia. Cuando una aplicacin cliente realiza una peticin de un objeto, se toma uno de la agrupacin de objetos disponibles y se utiliza para esa peticin. Cuando finaliza la peticin, el objeto se devuelve a la agrupacin para que pueda ser utilizado en otras peticiones de clientes. Podemos utilizar la agrupacin para mejorar el rendimiento de objetos que requieran grandes intervalos de tiempo para adquirir recursos y completar una operacin. Los objetos que no necesiten tales recursos no se beneficiarn significativamente de la agrupacin de objetos.
18
19
20
Especifican el atributo ConstructionEnabled para indicar que se necesita una cadena de constructor Reemplazan el mtodo Construct para recuperar informacin
<ConstructionEnabled(True)>Public Class Account <ConstructionEnabled(True)>Public Class Account Inherits ServicedComponent Inherits ServicedComponent Protected Overrides Sub Construct(ByVal s As String) Protected Overrides Sub Construct(ByVal s As String) 'Called after class constructor 'Called after class constructor 'Use passed in string 'Use passed in string End Sub End Sub End Class End Class
Presentacin
Los servicios de componentes proporcionan cadenas de constructor a componentes con servicio y son accesibles para componentes de Visual Basic .NET a travs del .NET Framework.
Podemos utilizar una cadena de constructor para controlar cmo se inicializan los componentes con servicio. Esto nos permite especificar cualquier informacin inicial que necesite el objeto, como una cadena de conexin a una base de datos, utilizando la consola de gestin de componentes de los servicios de componentes. Podemos utilizar el atributo ConstructionEnabled para habilitar este proceso en un componente con servicio. Nuestro componente en Visual Basic .NET puede recibir esta informacin del constructor porque la clase heredada ServicedComponent proporciona el mtodo sobrecargable Construct.
21
22
Uso de seguridad
Objetivo
Explicar cmo la seguridad de los servicios de componentes es accesible por los componentes de Visual Basic .NET.
Security configuration attributes enable security and role configuration SecurityCallContext class provides role checking and caller information
<ComponentAccessControl(True), SecurityRole("Manager")> _ <ComponentAccessControl(True), SecurityRole("Manager")> _ Public Class Account Public Class Account Inherits ServicedComponent Inherits ServicedComponent Public Function GetDetails( ) As String Public Function GetDetails( ) As String With SecurityCallContext.CurrentCall With SecurityCallContext.CurrentCall If .IsCallerInRole("Manager") Then If .IsCallerInRole("Manager") Then Return .OriginalCaller.AccountName Return .OriginalCaller.AccountName End If End If End With End With End Function End Function End Class End Class
Presentacin
Los servicios de componentes proporcionan informacin de seguridad que pueden utilizar los componentes de Visual Basic .NET.
Cuando se trabaja con componentes con servicio, se pueden utilizar atributos y objetos predefinidos para configurar y probar las opciones de seguridad.
ComponentAccessControl
SecurityRole
23
24
25
Otros servicios de componentes incluyen: Activacin Just-in-time Componentes en cola Propiedades compartidas Sincronizacin
Presentacin
Los servicios de componentes proporcionan otros servicios que podemos utilizar en componentes Visual Basic .NET.
Hay otros servicios de componentes que podemos utilizar desde componentes de Visual Basic .NET.
Activacin Just-in-Time
Cuando se habilita la activacin Just-in-time (JIT), un objeto es instanciado automticamente cuando se invoca un mtodo en un componente con servicio (activacin), y desactivado automticamente cuando el mtodo finaliza (desactivacin). Cuando esta opcin est habilitada, un objeto no mantiene el estado entre llamadas a mtodos, y esto incrementa el rendimiento y la escalabilidad de la aplicacin. Podemos sobrecargar los mtodos Activate y Deactivate heredados de la clase ServicedComponent para realizar funcionalidad personalizada durante JIT. Si la agrupacin de objetos est habilitada, la activacin ocurre cuando un objeto existente se extrae de la agrupacin, y la desactivacin ocurre cuando el objeto se inserta de nuevo en la agrupacin. JIT se habilita automticamente si un componente es transaccional, y no puede deshabilitarse. Podemos habilitar o deshabilitar JIT manualmente para componentes no transaccionales utilizando el atributo JustInTimeActivation.
Componentes encolados
Los componentes encolados proporcionan comunicacin asncrona. Esto permite a las aplicaciones cliente enviar peticiones a componentes encolados sin esperar una respuesta. Las peticiones se graban y se envan al servidor, donde permanecen encoladas hasta que la aplicacin est lista para usar las peticiones. A continuacin, estas peticiones se reproducen y retornan a la aplicacin como si se hubieran enviado desde un cliente normal. Podemos marcar una aplicacin para que utilice colas utilizando el atributo ApplicationQueuing a nivel de ensamblado. Marcamos los componentes individuales con el atributo InterfaceQueuing.
26
Propiedades compartidas
Podemos utilizar los componentes Shared Property Manager (SPM) para compartir informacin entre mltiples objetos en el mismo proceso de aplicacin. Los componentes SPM se utilizan del mismo modo que los componentes creados en Visual Basic 6.0.
Sincronizacin
Las aplicaciones distribuidas pueden recibir llamadas simultneas de mltiples clientes. Gestionar estas peticiones simultneas implica una lgica de programa compleja para garantizar que se accede a los recursos de forma segura y correcta. Los servicios de componentes proporcionan este servicio automticamente para componentes que utilizan transacciones. Tambin podemos utilizar el atributo Synchronization para especificar este comportamiento.
27
Setting assembly attributes ApplicationName Description ApplicationActivation: library or server application AssemblyKeyFile Using Regsvcs to register and create Component Services applications Regsvcs.exe myApplication.dll Using Lazy Registration Application registered on first use by client
Presentacin
Establecer atributos de los servicios de componentes a nivel de ensamblado ayuda a definir cmo se comportar la aplicacin cuando la implantemos bajo los servicios de componentes.
Podemos especificar algunos atributos a nivel de ensamblado que proporcionan informacin cuando nuestro ensamblado se instala como una aplicacin de servicios de componentes. La informacin se almacena en el archivo AssemblyInfo.vb que forma parte de nuestro proyecto en Visual Basic .NET.
Atributo de ensamblado ApplicationName Uso Si utilizamos este atributo para especificar el nombre de la aplicacin, una aplicacin de servicios de componentes con el mismo nombre cuando nuestro ensamblado sea implantado e instalado. Utilizamos este atributo para establecer el valor de la descripcin de la aplicacin de servicios de componentes cuando se implante e instale el ensamblado. Utilizamos este atributo para especificar si deseamos implementar nuestra aplicacin de servicios de componentes como una biblioteca o como una aplicacin de servidor. Los valores aceptables para este atributo son ActivationOption.Server o ActivationOption.Library. AssemblyKeyFile Utilizamos este atributo para especificar el nombre y la ubicacin del archivo que contiene el par de claves utilizado para generar un nombre compartido.
Description
ApplicationActivation
28
Registro automtico Si no registramos nuestra aplicacin manualmente, el registro se producir de modo automtico cuando una aplicacin cliente intente crear una instancia de una clase gestionada que herede de la clase ServicedComponent. Todas las clases ServicedComponent de nuestro ensamblado se registrarn como parte de la aplicacin de los Servicios de componentes. Este proceso se denomina Lazy Registration.
29
Presentacin
En esta demostracin, estudiaremos cmo crear un componente con servicio que utilice la agrupacin de objetos y cmo invocar el componente desde un cliente gestionado. Examinar la aplicacin de agrupacin de objetos 1. Abrir Microsoft Visual Studio .NET. 2. Abrir el proyecto ObjectPoolingComponent.sln que se encuentra en la carpeta ObjectPoolingComponent dentro del fichero demos11.zip. 3. Visualizar el cdigo de la clase Pooling, observando especialmente la instruccin Imports, los atributos a nivel de clase y la utilidad de cada miembro de la clase. 4. Visualizar el cdigo de la clase NoPooling, y observar que la clase es casi idntica a la clase Pooling, excepto en que no utiliza la agrupacin de objetos. 5. Visualizar el cdigo de la clase Report, y observar que el mtodo GetReport y el mtodo GetSharedProperty del mdulo modCommon. 6. Visualizar el archivo AssemblyInfo.vb file, y observar los tres primeros atributos del ensamblado que hacen referencia a las aplicaciones del componente con servicio. Crear la aplicacin del componente con servicio 1. Generar el proyecto y cerrar Visual Studio .NET. 2. Abrir Windows Explorer, e ir a la carpeta ObjectPoolingComponent\bin. 3. Hacer clic en Inicio, seleccionar Todos los programas, seleccionar Microsoft Visual Studio .NET, seleccionar Herramientas de Visual Studio .NET y hacer clic en Lnea de comandos de Visual Studio .NET.
30
4. En la ventana de comandos, escribir Regsvcs.exe y arrastrar el archivo ObjectPoolingComponent.dll desde Windows Explorer a la lnea de comandos. 5. Ejecutar el comando. Debera aparecer un mensaje indicando que el registro se ha realizado satisfactoriamente. Examinar la aplicacin del componente con servicio 1. Abrir la consola de Servicios de Componentes y analizar la aplicacin Object Pooling. 2. Ver las propiedades de los componentes NoPool y Pool, observando la configuracin de Agrupacin de objetos en la ficha Activacin de cada componente. Examinar el funcionamiento de la prueba 3. Abrir Visual Studio .NET. 4. Abrir el proyecto TestPooling.sln que se encuentra en la carpeta ObjectPoolingComponent\TestPooling. Esta carpeta se puede encontrar dentro del fichero demos11.zip. 5. Agregar una referencia de proyecto a ObjectPoolingComponent\bin\ObjectPoolingComponent.dll. Esta fichero se puede encontrar dentro del fichero demos11.zip. 6. Ver el cdigo del formulario, examinando cada mtodo. Probar el componente 1. Ejecutar el proyecto. 2. Hacer clic en Pooling y explicar los mensajes que aparecen. 3. Hacer clic en No Pooling y explicar los mensajes que aparecen. 4. Cerrar la aplicacin. 5. Ejecutar de nuevo el proyecto y mostrar que esta vez no hay nuevos objetos creados. 6. Cerrar la aplicacin y cerrar Visual Studio .NET.
Importante Si ha ejecutado esta demostracin con anterioridad en el mismo equipo, es posible que el componente con servicio ya est instalado. Elimine la aplicacin Object Pooling de la consola de Servicios de Componentes antes de ejecutar de nuevo esta demostracin.
31
Presentacin
En esta leccin, aprenderemos a: Describir la arquitectura de una clase de componentes. Crear una clase de componentes.
32
Presentacin
Las clases de componentes ofrecen varias caractersticas no incluidas en las clases estndares de Visual Basic .NET.
e las e System.ComponentModel.Component C s ba
Interfaz IComponent
es a s las ivad C r de
Clases de componentes
Clases predefinidas
Clases personalizadas
Adems de soportar clases y estructuras, el espacio de nombres System proporciona una biblioteca de componentes diseados para facilitar el desarrollo de componentes. Cuando creamos una clase de componentes basada en la clase base ComponentModel.Component, automticamente heredamos la arquitectura bsica para nuestra clase.
Interfaz IComponent
La interfaz IComponent permite crear componentes personalizados o configurar componentes existentes como MessageQueue o Timer en el diseador visual de nuestro componente. Despus de incluir componentes existentes al nuestro (ubicar), podemos acceder a ellos desde el cdigo de nuestro componente del mismo modo que cuando estn colocados en la bandeja de componentes de un formulario Windows Forms.
33
34
1. Heredar de System.ComponentModel.Component Realizar las inicializaciones por parte del constructor Sobrecargar el mtodo Dispose 2. Agregar los componentes ubicados Utilizar elementos del Explorador de servidores o del cuadro de herramientas 3. Crear la funcionalidad requerida Propiedades, mtodos y eventos 4. Generar el ensamblado
Presentacin
Crear una clase de componentes es similar a crear un elemento de clase estndar, pero hay algunos pasos adicionales.
El procedimiento para crear una clase de componentes con Visual Basic .NET es similar al procedimiento para crear clases estndares, pero hay algunos pasos adicionales. 1. Heredar de la clase System.ComponentModel.Component. El elemento de plantilla Component Class contiene el cdigo necesario para heredar de la clase System.ComponentModel.Component, incluyendo el cdigo de constructor requerido para agregar nuestra clase de componentes a un contenedor. Agregar cualquier cdigo de inicializacin para nuestra clase de componentes como parte del proceso de construccin insertando cdigo en el mtodo Sub New anteriormente escrito. Podemos sobrecargar el mtodo Dispose de la Component Class heredada para liberar recursos antes de que se destruya la instancia de nuestro componente. 2. Agregar componentes ubicados. Si nuestra clase de componentes requiere otros componentes para realizar su propsito, podemos agregarlos a la vista de diseo arrastrndolos desde el Cuadro de herramientas o el Explorador de servidores a nuestra clase de componentes. Estos componentes pueden ser accedidos programticamente desde dentro del cdigo de nuestra clase de componentes. 3. Crear la funcionalidad requerida. Nuestra clase de componentes puede proporcionar propiedades, mtodos y eventos pblicos para permitir que el usuario de nuestro componente pueda interactuar con l tanto en tiempo de diseo como en tiempo de ejecucin. 4. Generar el ensamblado. La generacin del ensamblado permite que otros clientes gestionados puedan hacer referencia a nuestro componente.
35
El siguiente ejemplo muestra cmo crear una clase de componentes derivada de la clase System.ComponentModel.Components. Extiende la funcionalidad de la clase Timer estndar definiendo propiedades y eventos adicionales.
Imports System.ComponentModel Public Class Hourglass Inherits System.ComponentModel.Component Public Event Finished(...) Private WithEvents localTimer As System.Timers.Timer Public Sub New( ) MyBase.New( ) 'This call is required by the Component Designer. InitializeComponent( ) 'Initialize the timer for 1 minute (60000 milliseconds) localTimer = New System.Timers.Timer( ) localTimer.Enabled = False localTimer.Interval = 60000 End Sub Public Property Enabled( ) As Boolean Get Return localTimer.Enabled End Get Set(ByVal Value As Boolean) localTimer.Enabled = Value End Set End Property Private Sub localTimer_Tick(...) Handles localTimer.Elapsed 'Raise the finished event after localtimer_Tick is raised RaiseEvent Finished( ) End Sub Public Overloads Overrides Sub Dispose( ) 'Disable the localTimer object localTimer.Enabled = False localTimer.Dispose( ) MyBase.Dispose( ) End Sub End Class
Sugerencia
36
Cuando examinemos el cdigo, observaremos lo siguiente: El componente se comporta como un reloj de arena que provoca un evento Finished un minuto despus de ser habilitado. El componente puede ser activado utilizando la propiedad Enabled en tiempo de diseo o en tiempo de ejecucin. Se inicializa localTimer como parte del constructor Sub New y se establece para un intervalo temporizador de 60.000 milisegundos, o un minuto. El mtodo Dispose se sobrecarga para garantizar que el objeto localTimer se elimina de forma segura.
37
Presentacin
Esta demostracin muestra cmo crear una clase de componentes stopwatch y utilizarla desde otra aplicacin.
En esta demostracin, aprenderemos cmo crear una clase de componentes que pueda ser utilizada por otro ensamblado. Examinar la clase de componentes Stopwatch 1. Abrir Visual Studio .NET. 2. Abrir el proyecto ComponentClasses.sln en la carpeta Stopwatch\Starter que se puede encontrar dentro del fichero demos11.zip. 3. Examinar la ventana de diseo de la clase de componentes Stopwatch y observar el control localTimer y sus propiedades. 4. Examinar el cdigo de la clase de componentes Stopwatch, y explicar cada miembro de la clase. Observar especialmente los atributos utilizados en las definiciones de las propiedades. Crear un icono en el Cuadro de herramientas para el componente
Sugerencia
5. Agregar una referencia para el ensamblado System.Drawing.dll. 6. Modificar la definicin de la clase como sigue:
<System.Drawing.ToolboxBitmap("")> _ Public Class Stopwatch
Comentar que debe agregarse una referencia adicional para permitirnos utilizar el atributo ToolboxBitmap desde el espacio de nombres System.Drawing en los proyectos generados sobre este tipo de plantillas de proyectos.
7. En el Explorador de soluciones, arrastrar el archivo Timer01.ico y colocarlo entre las comillas de la cadena del cdigo ToolboxBitmap(""). Comentar que agregar el mapa de bits como un recurso del ensamblado puede ser una mejor opcin, ya que no depender de que el archivo de icono est disponible en la ubicacin correcta. Sin embargo, para esta demostracin, este planteamiento es aceptable. Generar el componente 1. Generar el proyecto. 2. Cerrar el proyecto.
38
Modificar el funcionamiento de la prueba 1. Abrir el proyecto TestComponentClasses.sln de la carpeta Stopwatch\Starter\TestStopwatch que se puede encontrar dentro del fichero demos11.zip. 2. En el Cuadro de herramientas, hacer clic en la ficha General. 3. En el men Herramientas, hacer clic en Personalizar cuadro de herramientas, y clic en la ficha Componentes de .NET Framework. 4. Hacer clic en Examinar para localizar ComponentClasses.dll en la carpeta Stopwatch\Starter\bin, hacer clic en Abrir y en Aceptar. 5. En la ventana de diseo, abra Form1 y arrastre el componente Stopwatch desde el Cuadro de herramientas al formulario. 6. En la ventana de Propiedades del componente, cambiar el nombre del componente por sWatch y establecer la propiedad EnabledEvents en True. Observar la descripcin de la propiedad que proporciona el atributo Description. 7. Examinar el cdigo del formulario. Probar el componente 1. Ejecutar el proyecto, asegurndonos de que la ventana Resultados est visible en segundo plano. 2. Hacer clic en Start Stopwatch, y observar los eventos que se muestran en la ventana Resultados. Hacer clic en Tick Events para desactivar los eventos. 3. Hacer clic en Stop Stopwatch para mostrar cunto tiempo ha pasado desde que se invoc el mtodo Start en el componente Stopwatch. 4. Cerrar la aplicacin y cerrar Visual Studio .NET.
Importante Si ha ejecutado antes esta demostracin en el mismo equipo, es posible que el componente Stopwatch ya est disponible en el Cuadro de herramientas. Para asegurarse de que la demostracin funciona correctamente, restablezca el Cuadro de herramientas mediante el cuadro de dilogo Personalizar cuadro de herramientas.
39
Heredar de la clase UserControl Heredar de un control de formularios Windows Forms Proporcionar atributos de controles
Presentacin
Esta leccin examina cmo crear controles de formularios Windows Forms en Visual Basic .NET.
En versiones anteriores de Visual Basic, podemos crear controles ActiveX que pueden ser reutilizados por distintas aplicaciones cliente. En Visual Basic .NET, tambin podemos utilizar la herencia para crear controles. En esta leccin, aprenderemos a: Crear un control basado en la clase System.Windows.Forms.UserControl. Crear un control basado en un control existente Windows Forms. Agregar atributos a nuestros controles que habiliten funcionalidades avanzadas en tiempo de diseo.
40
Heredar de System.Windows.Forms.UserControl Agregar los controles necesarios al diseador Agregar propiedades y mtodos que correspondan a los de los controles constitutivos Agregar propiedades y mtodos adicionales No InitProperties, ReadProperties ni WriteProperties El almacenamiento de propiedades es automtico
Presentacin
En Visual Basic .NET, podemos heredar de la clase UserControl para crear el mismo tipo de controles de usuario que podemos crear en Visual Basic 6.0.
En versiones anteriores de Visual Basic, podemos crear un control nuevo y exclusivo colocando uno o ms controles existentes en un diseador UserControl. A continuacin, es posible crear propiedades, mtodos y eventos personalizados para establecer y recuperar valores para los controles contenidos. Este tipo de control es til cuando varios formularios requieren la misma composicin de controles, como formularios de direcciones o informacin de contacto.
41
escribimos cdigo en los eventos ReadProperties y WriteProperties de la clase UserControl. En Visual Basic .NET, esta persistencia de informacin es automtica y no requiere cdigo adicional.
Ejemplo
El siguiente ejemplo muestra cmo crear un control de usuario sencillo que contiene una etiqueta y un cuadro de texto:
Public Class LabelAndTextControl Inherits System.Windows.Forms.UserControl Public Property TextBoxText( ) As String Get Return TextBox1.Text End Get Set(ByVal Value As String) TextBox1.Text = Value End Set End Property Public Property LabelText( ) As String Get Return Label1.Text End Get Set(ByVal Value As String) Label1.Text = Value End Set End Property ... 'Windows Form Designer generated code End Class
Los controles TextBox1 y Label1 son variables declaradas privadas dentro del control de usuario a las que slo puede accederse utilizando las propiedades pblicas TextBoxText y LabelText.
42
Presentacin
En versiones anteriores de Visual Basic, podemos crear versiones mejoradas de un control existente ubicando una instancia del control en el diseador UserControl. A partir de aqu, podemos crear propiedades, mtodos y eventos pblicos que correspondan a los elementos equivalentes del control constituyente, agregando elementos personalizados para crear un comportamiento mejorado. En Visual Basic .NET, podemos crear un control que herede de cualquier clase System.Windows.Forms, como la clase TextBox o Label. Como esta aproximacin utiliza herencia, no es necesario crear propiedades, mtodos y eventos pblicos que se mapeen a los del control constitutivo. Esto reduce enormemente la cantidad de cdigo necesario. nicamente debemos crear la funcionalidad adicional, segn hemos comentado en el tema anterior para los controles de usuario. El siguiente ejemplo muestra cmo crear un control que herede de SystemWindows.Forms.TextBox y agregue una propiedad pblica:
Public Class MyTextBox Inherits System.Windows.Forms.TextBox Private strData As String Public Property HiddenData( ) As String Get Return strData End Get Set(ByVal Value As String) strData = Value End Set End Property ... End Class
43
Este cdigo crea un nuevo control que hereda todas las funcionalidades de la clase TextBox y aade una propiedad denominada HiddenData.
Nota Para algunos controles existentes, podemos crear un nuevo interfaz grfico sobrecargando el mtodo OnPaint de la clase base. Sin embargo, algunos controles, como el control TextBox, son pintados directamente por Windows y no pueden ser sobrecargados.
44
System.ComponentModel proprociona atributos a los controles A nivel de clase: DefaultProperty, DefaultEvent, ToolboxBitmap A nivel de propiedad: Category, Description, DefaultValue
Imports System.ComponentModel Imports System.ComponentModel <ToolboxBitmap("C:\txticon.ico"), DefaultEvent("Click")> __ <ToolboxBitmap("C:\txticon.ico"), DefaultEvent("Click")> Public Class MyTextBox Public Class MyTextBox Inherits System.Windows.Forms.UserControl Inherits System.Windows.Forms.UserControl <Category("Appearance"), __ <Category("Appearance"), Description("Stores extra data"), __ Description("Stores extra data"), DefaultValue("Empty")> __ DefaultValue("Empty")> Public Property HiddenData( ) As String Public Property HiddenData( ) As String ... ... End Property End Property ... ... End Class End Class
Presentacin
Los atributos de los controles pueden utilizarse para proporcionar informacin adicional sobre el control y sus propiedades, mtodos y eventos.
En versiones anteriores de Visual Basic, podemos utilizar el cuadro de dilogo Procedure Attributes para establecer atributos para los controles, como descripciones de las propiedades y sus categoras, que pueden ser visualizados en el Examinador de Objetos. Podemos proporcionar informacin similar en Visual Basic .NET utilizando los atributos que ofrece el espacio de nombres System.ComponentModel.
45
46
Presentacin
En esta demostracin, estudiaremos cmo crear un control basado en el control TextBox de Windows Forms.
En esta demostracin, estudiaremos cmo crear un control de usuario de Windows Forms basado en el control TextBox existente. Visualizar el cdigo 1. Abrir Visual Studio .NET. 2. Abrir el proyecto MyControls.sln project de la carpeta UserTextBox que se puede encontrar dentro del fichero demos11.zip. 3. Visualizar el cdigo para la clase MyTextBox y examinar todos los miembros de la clase. 4. Generar el proyecto y cerrarlo. Crear el funcionamiento de la prueba 1. Abrir el proyecto TestControl.sln de la carpeta UserTextBox\TestControl\Starter que se puede encontrar dentro del fichero demos11.zip. 2. En el Cuadro de herramientas, hacer clic en la fecha General. 3. En el men Herramientas, hacer clic en Personalizar cuadro de herramientas. En el cuadro de dilogo Personalizar cuadro de herramientas, hacer clic en la ficha Componentes de .NET Framework. 4. Hacer clic en el botn Examinar para localizar MyControls.dll en la carpeta UserTextBox\bin, hacer clic en Abrir y en Aceptar. 5. Mostrar el formulario de prueba si no est visible. 6. En el Cuadro de herramientas, arrastrar MyTextBox al formulario para crear una instancia del control MyTextBox. 7. Cambiar el nombre del control myTB, y ponerlo junto a la etiqueta MyTextBox. Establecer la propiedad Text del control en cero.
47
8. En el controlador de eventos Click del botn Undo, elimine el comentario de la instruccin myTB.Undo. Probar el control 1. Ejecutar el proyecto. 2. Cambiar secuencialmente el valor del texto de cada cuadro de texto en base a los siguientes valores:
Control TextBox MyTextBox TextBox MyTextBox TextBox MyTextBox Valor de texto One One Two Two Three Three
3. Hacer clic en el botn Undo cuatro veces y observar los cambios de cada cuadro de texto. 4. Cerrar el formulario y cerrar Visual Studio .NET.
48
Qu es un hilo? Ventajas de mltiples hilos de ejecucin Creacin de hilos Uso de hilos Cundo utilizar el manejo de hilos
Presentacin
Visual Basic .NET permite a los desarrolladores utilizar la potencia de manejar hilos de ejecucin de un modo no disponible anteriormente en Visual Basic.
Las versiones anteriores de Visual Basic tienen un limitado soporte de manejo de hilos (threads) de ejecucin. Visual Basic .NET permite a los desarrolladores utilizar todas la potencia de los hilos cuando es necesario. Si manejamos los hilos de ejecucin correctamente, podemos mejorar el rendimiento de nuestra aplicacin y hacerla mucho ms interactiva. En esta leccin, aprenderemos a: Explicar los conceptos bsicos del manejo de hilos de ejecucin. Conocer las ventajas de incorporar mltiples hilos a nuestras aplicaciones. Crear y utilizar hilos utilizando el espacio de nombres System.Threading. Evitar algunos problemas potenciales en nuestras aplicaciones que usen mltiples hilos de ejecucin.
Aviso Esta seccin ofrece una descripcin general sobre el uso de hilos en Visual Basic .NET. ste es un tema muy complejo, y debemos estar seguros de que comprendemos completamente sus implicaciones antes de utilizar estos mtodos. Si deseamos obtener ms informacin, consultar el SDK del .NET Framework.
49
Qu es un hilo?
Objetivo
Explicar los conceptos bsicos del manejo de hilos de ejecucin.
Presentacin
Antes de examinar cmo Visual Basic .NET permite manejar hilos, es importante entender los conceptos bsicos del mismo.
Proceso 1
Proceso 2
Sugerencia
La diapositiva asociada a este tema est animada. Hacer clic sobre ella para revelar las siguientes lecciones, mostrando el proceso iterativo del planificador de hilos: 1. Hilo 1 2. Hilo 2 3. Hilo 3 4. Hilo 1 5. Hilo 2 6. Hilo 3
Una aplicacin ejecutndose en un equipo es un proceso. Cada proceso realiza trabajo utilizando uno o ms hilos. El hilo es la unidad de ejecucin procesada por el procesador (CPU) del equipo.
50
Tipos de hilos
Cada lenguaje de programacin puede soportar un tipo de hilo distinto: Las versiones anteriores de Visual Basic soportan el modelo de hilos apartamento (apartment). Este modelo impone algunas restricciones en los tipos de aplicaciones que estas versiones pueden crear. Una de estas restricciones es que un objeto est ligado al hilo en el que est creado, y no puede utilizarse con la agrupacin de objetos en los servicios de componentes. Sin embargo, este modelo facilita el desarrollo, ya que nos evita tratar con aspectos ms complejos como la sincronizacin. Visual Basic .NET soporta el modelo de hilos libre (free). Este modelo permite utilizar mltiples hilos de ejecucin y caractersticas como la agrupacin de objetos o continuar utilizando un nico hilo como en las aplicaciones creadas con las versiones anteriores de Visual Basic.
51
Mejor respuesta de la interfaz de usuario Ejemplo: barra de estado Sin bloqueos Comunicacin asncrona Sin afinidad de hilos Los objetos no estn vinculados a un hilo
Presentacin
Tener mltiples hilos de ejecucin puede proporcionar numerosos beneficios a nuestras aplicaciones.
Una aplicacin con mltiples hilos de ejecucin tiene varias ventajas respecto a una aplicacin con un nico hilo.
Sin bloqueos
El bloqueo se produce porque una llamada a una aplicacin con un nico hilo debe esperar hasta que cualquier llamada previa por parte de otra aplicacin cliente haya sido completamente satisfecha antes de ejecutar cualquier otro cdigo. En aplicaciones basadas en servidor, el bloqueo ocurrir si mltiples clientes realizan peticiones simultneas de un proceso y slo est disponible un nico hilo. Aplicaciones con mltiples hilos de ejecucin pueden realizar acciones sobre diferentes hilos simultneamente (mediante la planificacin de hilos) sin esperar a que otros hilos finalicen su ejecucin actual. Esto permite a mltiples clientes ser gestionados por hilos diferentes sin bloquearse en una aplicacin basada en servidor.
52
Comunicacin asncrona
Es posible la comunicacin asncrona en una aplicacin con mltiples hilos de ejecucin porque un hilo puede realizar una peticin a otro hilo. El hilo llamador puede proseguir con otro procesamiento porque la peticin se ejecuta en un hilo separado. Puede lanzarse un evento cuando el segundo hilo finalice la ejecucin de la funcionalidad solicitada, informando al primer hilo que ha completado su trabajo.
53
Creacin de hilos
Objetivo
Explicar cmo crear y utilizar hilos.
Uso de la clase System.Threading.Thread El constructor especifica el mtodo delegado Los mtodos proporcionan control del procesamiento de hilos Las propiedades proporcionan informacin de estado y prioridades Utilizar una clase si se requieren parmetros Permitir acceso pblico a variables clase Lanzar un evento cuando finalice
Presentacin
El .NET Framework proporciona la clase System.Threading.Thread, que permite crear mltiples hilos.
El .NET Framework proporciona un modo sencillo de crear y trabajar con mltiples hilos.
Usar la clase Thread para crear mltiples hilos dentro de una aplicacin basada en Visual Basic .NET.
54
Suspend Resume
Aviso Si establecemos las prioridades de un hilo a un valor Highest, podemos afectar a otros procesos vitales del sistema reducindoles ciclos de CPU. Utilizar esta configuracin con extrema precaucin.
55
No podemos especificar un mtodo delegado que acepta argumentos en el constructor del hilo. Si nuestro procedimiento requiere informacin para realizar su accin, podemos: Usar clases para proporcionar mtodos que realicen operaciones sobre datos locales Usar propiedades pblicas o variables para suministrar los datos locales. Para usar clases y suministrar parmetros, debemos crear una instancia de la clase antes de llamar al constructor del hilo. Utilizar el operador AddressOf para pasar una referencia al mtodo de la clase como el parmetro del constructor. A continuacin podemos usar las propiedades o variables pblicas para suministrar cualquier dato requerido por el mtodo. Cuando el mtodo finalice su ejecucin, podemos lanzar un evento para informar al hilo que origin la llamada que la operacin se ha completado.
56
Uso de hilos
Objetivo
Explicar un ejemplo sencillo del manejo de hilos.
Class Calculate Class Calculate Public iValue As Integer Public iValue As Integer Public Event Complete(ByVal Result As Integer) Public Event Complete(ByVal Result As Integer) Public Sub LongCalculation( ) Public Sub LongCalculation( ) 'Perform a long calculation based on iValue 'Perform a long calculation based on iValue ... ... RaiseEvent Complete(iResult) 'Raise event to signal finish RaiseEvent Complete(iResult) 'Raise event to signal finish End Sub End Sub End Class End Class Sub Test( ) Sub Test( ) Dim calc As New Calculate( ) Dim calc As New Calculate( ) Dim th As New Threading.Thread(AddressOf calc.LongCalculation) Dim th As New Threading.Thread(AddressOf calc.LongCalculation) calc.iValue = 10 calc.iValue = 10 AddHandler calc.Complete, AddressOf CalcResult AddHandler calc.Complete, AddressOf CalcResult th.Start( ) th.Start( ) End Sub End Sub Sub CalcResult(ByVal Result As Integer) Sub CalcResult(ByVal Result As Integer) ... ... End Sub End Sub
Presentacin
Este tpico muestra cmo preparar una clase para el manejo de hilos; crear un hilo, iniciar el hilo y realizar clculos sobre el nuevo hilo.
Al examinar el cdigo anterior, observaremos lo siguiente: La clase proporciona una funcin LongCalculation, que se ejecutar en un hilo separado. La funcin utiliza informacin almacenada en la variable pblica entera iValue para calcular su resultado. La clase Calculate proporciona un evento Complete para notificar al hilo que realiza la llamada que el clculo ha finalizado.
57
Al examinar este cdigo, observamos lo siguiente: La subrutina Test instancia un objeto Calculate y especifica el delegado LongCalculation en el constructor Thread. Se asigna un valor a la variable iValue para su uso por parte de la funcin Se crea un gestor de eventos para detectar la finalizacin del clculo. El mtodo Start se invoca en el hilo separado para comenzar el proceso de clculo.
58
Utilizar los subprocesos con precaucin El uso de ms subprocesos requiere ms recursos del sistema Sincronizar el acceso a recursos compartidos Evitar que dos subprocesos accedan simultneamente a datos compartidos Utilizar la instruccin SyncLock para bloquear secciones de cdigo
Sub Worker( ) Sub Worker( ) SyncLock(theData) 'Lock this object variable SyncLock(theData) 'Lock this object variable theData.id = iValue theData.id = iValue 'Perform some lengthy action 'Perform some lengthy action iValue = theData.id iValue = theData.id End SyncLock 'Unlock the object variable End SyncLock 'Unlock the object variable End Sub End Sub
Presentacin
Sugerencia
Apunte que el uso incorrecto de los hilos puede tener serias consecuencias.
Utilizar mltiples hilos es un concepto de programacin til en el desarrollo empresarial; sin embargo, el uso inapropiado de los hilos puede causar problemas de rendimiento, crear datos inconsistentes y otros errores.
Recursos compartidos
Si mltiples hilos necesitan acceder a la misma informacin al mismo tiempo, puede producirse un problema de concurrencia. Dos hilos accediendo a un recurso global compartido pueden generar resultados inconsistentes si otros hilos han alterado los datos. He aqu un ejemplo de una situacin en la que esto puede suceder: El hilo A actualiza un valor en un recurso compartido como un entero, estableciendo el valor a 10 antes de realizar alguna accin de larga duracin. El hilo B actualiza el mismo valor entero a 15 durante la duracin de la accin de larga duracin del hilo A. Cuando se completa esta accin, el hilo A puede leer de nuevo el valor entero del recurso cuyo valor es ahora 15.
59
60
61
Presentacin
Esta demostracin muestra cmo utilizar la sentencia SyncLock para sincronizar un recurso compartido.
Informacin
Los hilos en esta demostracin pueden no ejecutarse en el orden en que han sido lanzados, de modo que nuestros resultados pueden no ser estrictamente los mismos.
En esta demostracin, aprenderemos cmo usar la sentencia SyncLock cuando utilicemos mltiples hilos en una aplicacin creada en Visual Basic .NET. Para examinar la aplicacin de agrupacin de objetos 1. Abrir Visual Studio .NET. 2. Abrir el proyecto ThreadingDemo.sln de la carpeta ThreadingDemo que se puede encontrar dentro del fichero demos11.zip. 3. Examinar el cdigo del formulario frmThreading, explicando brevemente cada miembro. 4. Examinar el cdigo de la clase ThreadObj, explicando brevemente cada miembro. Para probar la aplicacin 1. Ejecutar el proyecto. 2. Hacer clic en el botn Without SyncLock y observar que los resultados no concuerdan con los esperados. 3. Hacer clic en el botn With SyncLock y observar que los resultados coinciden correctamente con los esperados. 4. Salir de la aplicacin. 5. Examinar de nuevo el cdigo WithSyncLock dentro de la clase ThreadObj, clarificando el uso de la sentencia SyncLock que produce los resultados correctos. 6. Salir de Visual Studio .NET.