RSS 2.0 Atom 1.0 CDF  
JASoft.org - November, 2005
El blog de José Manuel Alarcón Aguín. Programación .NET y mucho más...
 

En la versión 1.x de .NET, cuando generábamos un proxy para acceder al uso de un servicio Web, para cada método disponible en el servicio se generaban una pareja de métodos para lamadas asíncronas. Estos métodos se llamaban igual que el método original pero su nombre comenzaba por Begin y End respectivamente. Por ejemplo, si teníamos un método llamago GetClientes, se generaban los métodos BeginGetClientes y EndGetClientes. Con ellos se podían realizar llamadas asíncronas al método siguiendo una mecánica coherente con la que existe en el resto de la plataforma.

Sin embargo en la versión 2.0, el generador de proxies a servicios Web utiliza una estrategia diferente. Los métodos Begin y End ya no aparecen y a más de uno le puede despistar esto.

Lo cierto es que en esta nueva versión es mucho más sencillo hacer estas llamadas asíncronas ya que no dependemos de IAsyncResult y otras interfaces esotéricas, sino que es tan fácil como declarar un evento para responder a las llamadas. Veamos un ejemplo.

Supongamos que tenemos un método en nuestro servicio Web que se llama GetClientes. En el lado del cliente, tras agregar la referencia Web se genera un proxy en el cual se define un método homónimo. En la versión 2.0 se genera también un método del mismo nombre pero seguido del sufijo "Async", es decir, en nuestro ejemplo sería GetClientesAsync.

Este método es exactamente igual al original pero con la diferencia de que no devuelve un valor y además se devuelve el control inmediatamente al código llamante, ya que se ejecuta en segundaplano de manera asíncrona.

Hasta aquí todo perfecto. La cuestión es que además de hacer la llamada asíncronamente hay que obtener el resultado de dicha llamada. La solución la tenemos fácil ya que también se define un nuevo evento en el proxy que sirve para este propósito. Su nombre es igual al del método pero terminado en "Completed", es decir, GetClientesCompleted en nuestro caso. Este evento necesita un delegado a un método que será llamado automáticamente cuando termine la ejecución asíncrona del método. El gestor del evento no devuelve valor alguno y toma como parámetros un objeto (como casi todos los eventos en .NET) y un objeto de la clase GetClientesCompletedEventArgs, es decir el nombre del metodo seguido de "CompletedEventArgs".

Este objeto tiene una propiedad Result en la que aparecerá el resultado de la llamada. Lo interesante del caso es que, además, no se ha utilizado un tipo Object neutro para Result sino que la propiedad ya será directamente del tipo adecuado. La verdad es que más cómodo posible.

Pongámoslo en la práctica con el ejemplo dado y suponiendo que GetClientes toma como parámetro el nombre del país de origen de los clientes de nuestro interés y devuelve un DataSet genérico con una tabla que contiene los datos de dichos clientes.

Lo primero es definir el manejador de evento de terminación de la llamada, así:

private void GetClientesTerminado(object sender, GetClientesCompletedEventArgs args)
{
            DataSet ds = args.Result;
            //Se enlaza a un dataGrid, por ejemplo.
            this.dataGridView1.DataSource = ds.Tables["Clientes"];
}

Nótese que el resultado es directamente un DataSet. No necesitamos hacer una conversión explícita desde un objeto ni nada similar. Más cómodo imposible.

Ahora sólo falta asignar el manejador del evento y llamar asíncronamente al método correspondiente:

MiServicioProxy proxy = new MiServicioProxy();
proxy.GetClientesCompleted += this.GetClientesTerminado;
proxy.GetClientesAsync("ES");

Como se observa hemos creado una instancia del proxy, asignado en ésta el manejador del evento y luego hemos llamado al método asíncronamente pasándole los parámetros de la manera habitual. Fácil ¿verdad?

Pues eso que hemos ganado ;-)

NOTA: Todo esto y mucho más se explica en el curso sobre servicios Web de campusMVP.com. ¡Apúntante! Aún estás a tiempo de obtenerlo con subvención si eres español y trabajador en activo.

Por: José Manuel Alarcón Aguín | Saturday, November 26, 2005 5:16:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

El nuevo control ObjectDataSource es muy útil a la hora de enlazar una rejilla u otro control de ASP.NET 2.0 con un objeto de negocio, como por ejemplo un Servicio Web o un objeto propio.

Los métodos de selección, inserción, actualización o borrado de registros pueden tener parámetros que es necesario ajustar. Por ejemplo en la siguiente figura el método de selección dispone de un paráemtro "Pais" que es necesario ajustar para poder obtener los datos:

El propio diálogo de configuración nos ofrece la posibilidad de asociarle a cada uno de los parámetros, aparte de un control por defecto, algún origen que sirva para asignarlo (una cookie,uncontrol, etc...):

Aunque esto llega en la mayor parte de los casos y es muy cómodo, puede darse el caso de que necesitemos cambiar nosotros dinámicamente el valor de un parámetro usando cualquier código de cosecha propia.

Lo primero que cabe pensar es acudir a la propiedad SelectParameters del control ObjectDataSource, y escribir algo así:

ObjectDataSource1.SelectParameters(

"Pais").Value = "Spain"

Por desgracia esto no funciona. Los parámetros del control no se pueden establecer desde esta colección, por lo que este código generará un error.

La forma de conseguirlo es mucho más rebuscada: Hay que gestionar los eventos de selección, actualziación, borrado o inserción y hacer el cambio en ellos a través de los parámetros que envían.

Por ejemplo, para cambiar el parámetro de selección de nuestro ejemplo debemos usar el siguiente código (sin que sirva de precedente en VB.NET):

Protected Sub ObjectDataSource1_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ObjectDataSourceSelectingEventArgs) Handles ObjectDataSource1.Selecting

e.InputParameters(

"Pais") = "Spain"

End Sub

La verdad es que me pafece un tanto rebuscado y, aunque es muy fácil escribir este código, considero que más fácil sería permitirlo desde las correspondientes propiedades, forzando si quieres el re-enlace del control. Pero bueno...

Por: José Manuel Alarcón Aguín | Tuesday, November 22, 2005 12:05:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

Hoy he leído desde la página principal de mi flamante Visual Studio 2005 RTM (versión definitiva) un artículo muy útil de James Avery titulado "Visual Studio Add-Ins Every Developer Should Download Now". Había varias cosas bastante útiles pero me han gustado especialmente dos de ellos:

1.- Smart paster 1.1: permite copiar el contenido de texto que haya en el portapapeles pero de manera "inteligente", de ahí el nombre. Fíjate en las opciones que ofrece:

Es decir, puedes pegar el texto como un comentario, como un literal de tipo cadena correctamente formateado para el lenguaje que utilices (VB o C#), como una serie de líneas de código que generan la misma cadena pero a partir de un StringBuilder, y tal cual está pero metido dentro de una región.

Me parece muy útil si debes embeber en el código líneas un tanto largas (como por ejemplo alguna consulta "a pinrel" que haya quedado extensa) y cosas por el estilo. Lástima que de momento no haya versión para VS2005.

Descargas desde: http://weblogs.asp.net/alex_papadimoulis/archive/2004/05/25/141400.aspx

2.- Buscador para P/Invoke .NET: PInvoke.net es una excelente Web creada como wiki en el que la gente colabora aportando información sobre el uso de funciones de la API de Windows desde .NET. Me parece un lugar super-útil pero más útil resulta si ni siquiera tienes que abrir el navegador para buscar en él. Y esto es precisamente lo que ofrece el complemento del que hablo:

Desde el propio entorno de desarrollo llamamos al complemento y al poner cualquie rnombre de función de la API nos ofrece diversas posibilidades para declararla en el código. Lo dicho: para tener a mano siempre.

En el artículo hay más cosas interesantes pero estas dos son las que más me gustán.

Por: José Manuel Alarcón Aguín | Saturday, November 19, 2005 8:58:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

En el post sobre Avalon y XAML que hice el otro día, comentaba que WPF me gustaba, entre otras cosas, porque en teoría no era dependiente del sistema operativo y por lo tanto se podría portar (en teoría, ya digo) a otros sistemas operativos.

Hoy leo en la edición impresa de Noviembre de Microsoft Directions, la revista independiente que trata sobre todo lo que tiene que ver con Microsoft, que al parecer habrá una versión (algo recortada) de WinFX-Avalon ¡para Linux y MacOS!

Me ha sorprendido mucho pero desde luego me parece una gran noticia y me reafirma en lo que decía en aquel post.

Ya veremos que pasa al final, porque como se suele decir "del dicho al hecho hay un trecho" ;-)

Por: José Manuel Alarcón Aguín | Tuesday, November 15, 2005 10:26:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Noticias Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

¿Cómo averiguamos la ruta en la que está un ejecutable?

Hay varias formas para todos los gustos: desde los que van a lo práctico a los que les "mola" complicarse la vida. Veámoslas todas ;-)

- Solución 1 (fácil):

private static string RutaActual()
{
     return Environment.CurrentDirectory;
}

- Solución 2 (fácil):

using System.IO;

private static string RutaActual()
{
     return Directory.CurrentDirectory;
}

- Solución 3 (media):

using System.Diagnostics;

private static string RutaActual()
{
     string arch = Process.GetCurrentProcess().MainModule.FileName;
     return arch.Substring(0, arch.LastIndexOf("\\"));
}

- Solución 4 (super-rebuscada: como la hace la plataforma .NET y usando la API):

private static string RutaActual()
{
      string text2;
      StringBuilder builder1 = new StringBuilder(0x105);
      if (Win32Native.GetCurrentDirectory(builder1.Capacity, builder1) == 0)
      {
            __Error.WinIOError();
      }
      string text1 = builder1.ToString();
      if (text1.EndsWith(@"\"))
      {
            text2 = text1 + ".";
      }
      else
      {
            text2 = text1 + @"\.";
      }
      string[] textArray1 = new string[] { text2 } ;
      new FileIOPermission(FileIOPermissionAccess.PathDiscovery, textArray1, false, false).Demand();
      return text1;
}

En esta última me niego a poner todas las definiciones (copiado y pegado de .NET Reflector) :-(

Escoja la que más le guste, pero lo cierto es que usar la 1, la 2 o 3 es exactamente lo mismo porque las dos primeras llaman a esta última. Así que en el fondo la más rápida puede que sea la tercera que usa una manera completamente distinta de hacerlo ¿o no? Quien sabe... ;-)

Por: José Manuel Alarcón Aguín | Thursday, November 10, 2005 9:14:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

XAML (eXtensible Application Markup Language) es el lenguaje XML que define elementos de la interfaz de usuario en Windows Presentation Foundation (Avalon).

Avalon está muy bien y permitirá crear interfaces avanzadas que hoy en día son casi impensables. Sin embargo no es eso lo que más me gusta. hay varias cuestiones que me parecen importantes:

· Como programadores de ASP.NET tendremos una gran ventaja frente a muchos programadores tradicionales de aplicaciones Windows ya que el desarrollo en el futuro con WPF se va a parecer mucho más al actual ASP.NET que a cualquier otra cosa.

· Aunque los "controles" de Avalon parecen botones, listas, etc... en realidad son entidades tridimensionales Direct 3D definidas en la memoria de la tarjeta gráfica. Adios a la API de Windows por debajo. Hola elevado rendimiento y (en teoría) portabilidad.

· Las interfacesde usuario, aparte de ir compiladas dentro de un ensamblado como hasta ahora (usan recursos que son versiones binarias optimizadas de de XAML, llamadas BAML), pueden enviarse entre capas de una aplicación interpretándose y generándose en tiempo de ejecución a partir del XAML.

Esto último me parece interesantísimo. Ahora no sólo podremos distribuir los componentes de negocio entre varias máquinas sino que se puede hacer lo propio con la interfaz de usuario. Es decir, podremos hacer cosas como actualizar las interfaces sin tocar el ejecutable del cliente, definir nuevas pantallas en el servidor y, como no, definir nuevas interfaces al vuelo según las necesidades. Imagina las posibilidades de esto.

Por: José Manuel Alarcón Aguín | Sunday, November 06, 2005 8:10:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

Pues sí, mañana día 7 de noviembre se presentan oficialmente las versiones definitivas de Visual Studio 2005, SQL Server 2005 y Biztalk Server 2006. Por supuesto ¡Estás invitado!.

Team System, el componente de gestión de proyectos de Visual Studio 2005 se retrasa hasta Enero, al igual que la versión en castellano del entorno. Yo por lo de pronto ya estoy usando la versión definitiva en inglés de estos productos y me encantan.

Mañana por lo visto es un día de presentaciones. En España nace el nuevo canal de televisión Cuatro. De momento lo que he visto anunciar no me tiene muy buena pinta pero era de esperar si queire competir con la telebasura que nos ponen en España desde hace años :-(((

Por: José Manuel Alarcón Aguín | Sunday, November 06, 2005 7:39:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Noticias Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

Hoy he descubierto esta estupenda utilidad: http://www.fs-driver.org/

screenshot

 Se trata de un controlador en modo Kernel para Windows que permite utilizar particiones Ext2 de Linux nativamente desde el sistema de Microsoft. Esto implica que con él es posible acceder, leer, escribir y utilizar en general cualquier partición Ext2 como si fuera NTFS o FAT32, con las consabidas ventajas para administradores de sistemas, programadores, y manitas en general. Por no mencionar lo que facilita compartir información entre ambos sistemas.

¡Ah!, y es gratuita, claro :-)

Por: José Manuel Alarcón Aguín | Saturday, November 05, 2005 11:57:00 AM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Trucos y consejos genéricos


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner

Una carencia tonta que tenían las versiones 1.x de .NET era la de una forma de medir el tiempo con elevada precisión. Y digo carencia "tonta" porque en realidad no cuesta mucho crear una clase así y es algo que los programadores solemos agradecer ya que lo usamos mucho para medir la velocidad de ciertos fragmentos de código y cosas así.

Una forma muy sencilla pero al mismo tiempo muy poco precisa de hacer mediciones es usar la clase DateTime de .NET. Puede servirnos para medir espacios de tiempo muy grandes (de muchos segundos) en los que no sea necesario afinar demasiado o conseguir mucha precisión, así:

DateTime comienzo = DateTime.Now;
//Aquí ejecutamos lo que sea que vamos a medir
double tiempo = (DateTime.Now - comienzo).TotalMilliseconds;

Con esto obtenemos el número de milisegundos entrela fecha de comienzo y la de fin pero la precisión es relativamente mala porque no se usan los contadores de alto rendimiento del sistema.

Otra opción es usar la API de Windows para acceder a estos contadores de alta precisión del sistema, para lo que deberemos definir las funciones externas así:

 [System.Runtime.InteropServices.DllImport("KERNEL32")]
 private static extern bool QueryPerformanceCounter(ref long lpPerformanceCount);
 [System.Runtime.InteropServices.DllImport("KERNEL32")]
 private static extern bool QueryPerformanceFrequency(ref long lpFrequency);

Ahora para medir el tiempo trasncurrido en ticks del reloj interno habría que escribir algo similar a lo siguiente:

long frecuencia = 0;
QueryPerformanceFrequency(ref frecuencia); //Frecuencia del reloj interno
long comienzo= 0;
QueryPerformanceCounter(ref comienzo);
//Aquí ejecutamos lo que sea que vamos a medir
long final = 0;
QueryPerformanceCounter(ref final);
float intervalo = (float)(final - comienzo) / frecuencia;

Así tendríamos en la variable 'intervalo' el número de milisegundos pero couna gran precisión y decimales incluidos.

Bueno, por fortuna .NET 2.0 trae "de serie" una clase especializada en estos menesteres y que ya nos permite hacer este tipo de mediciones de forma nativa e inmediata pero sin sacrificar la precisión. Se trata de la clase Stopwatch que se encuentra en el espacio de nombres System.Diagnostics. Ofrece una propiedad Frequency para ver la frecuencia así como varios métodos destinados a cronometrar intervalos. Puedes encontrar detalles de esta clase y sus miembros en http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch

Por: José Manuel Alarcón Aguín | Friday, November 04, 2005 6:10:00 PM (Hora estándar romance, UTC+01:00)  #    Comments [0] - Trackback
Tags: Programación


Sígueme en:

:: Twitter JM Alarcón: tecnología, marketing, este blog y frikadas varias
:: Twitter campusMVP: los mejores recursos sobre tecnología Microsoft: trucos, artículos, noticias, vídeos...
:: Facebook campusMVP: los mismos mejores recursos pero en directamente en Facebook.
:: Boletín campusMVP Nuestra publicación electrónica, una vez al mes en tu buzón de correo.
 
Banner
Copyright © 2010 José Manuel Alarcón Aguín. All rights reserved.