Mostrando entradas con la etiqueta Visual Studio 2008. Mostrar todas las entradas
Mostrando entradas con la etiqueta Visual Studio 2008. Mostrar todas las entradas

Trabajando con hilos en C# - Working with threads in C#

Cuando alguien está desarrollando aplicaciones de escritorio, las cuales cada vez son menores ya que la mayoría de aplicaciones que se desarrollan hoy en día son Web, a menudo se encuentra con que un algoritmo tarda un poco más de la cuenta, con el resultado de que bloquea el proceso y por una parte no te deja hacer nada más con la aplicación, mientras que por otro lado parece que se haya quedado colgada, cosa que puede dar problemas porque el usuario cierre la aplicación, mate el proceso o cualquier otra acción similar. Por ello siempre se recomienda el uso de hilos o threads.

Como hacía bastante tiempo que no desarrollaba aplicaciones de escritorio el tema de los threads no lo tenía muy fresco, por lo que tuve que buscar algo de información para pequeños detalles que no recordaba. Los resultados los encontré en diferentes sitios, por eso me animé a reunirlos todos en este post, por si le pudiera servir a alguien de ayuda en un futuro.

Crear y lanzar un nuevo thread es fácil:

public class Simple
{
   public static int Main()
   {
      Console.WriteLine("Thread Start/Stop/Join Sample");
      
      // Create the thread object, passing in the Alpha.Beta method
      // via a ThreadStart delegate. This does not start the thread.
      Thread oThread = new Thread(new ThreadStart(this.Beta));

      // Start the thread
      oThread.Start();

      // Spin for a while waiting for the started thread to become
      // alive:
      while (!oThread.IsAlive);
      
      // Put the Main thread to sleep for 1 millisecond to allow oThread
      // to do some work:
      Thread.Sleep(1);
      
      // Request that oThread be stopped
      oThread.Abort();
      
      // Wait until oThread finishes. Join also has overloads
      // that take a millisecond interval or a TimeSpan object.
      oThread.Join();
      
      Console.WriteLine();
      Console.WriteLine("Alpha.Beta has finished");
      
      try 
      {
         Console.WriteLine("Try to restart the Alpha.Beta thread");
         oThread.Start();
      }
      catch (ThreadStateException) 
      {
         Console.Write("ThreadStateException trying 
         to restart Alpha.Beta. ");
         Console.WriteLine("Expected since aborted threads 
         cannot be restarted.");
      }
      return 0;
   }
}

En el código anterior tenéis, además, formas de pausar o detener un hilo.
Al crear el hilo hemos puesto this.Beta porque el método al que llamamos está en nuestra clase. Si el método al que queremos llamar se encontrara en otra clase deberíamos poner su nombre primero:

      Thread oThread = new Thread(new ThreadStart(Classname.Beta));



Bueno, hasta aquí todo sencillo. Ahora toca saber cómo pasarle parámetros al método al que llamamos. Olvidaos de ParameterizedThreadStart, con esta forma podréis pasarle múltiples parámetros:

string filename = ...
Thread thread = new Thread(() => download(filename)); 
thread.Start(); 



Y de momento es todo por hoy. En un próximo artículo explicaré cómo poder acceder a esos objetos que quedan bloqueados por el hilo principal y nos traen de cabeza.

Obtener el directorio de ejecución de tu aplicación con C# (equivalencia a App.Path)

Hace años ya me enfrenté a este problema y en su día lo solucioné, pero hoy me he vuelto a enfrentar a él y no recordaba cómo era. Lo que sí recordaba era que había varias formas, pero sólo una de ellas era la idónea para mí, para lo que necesitaba hacer en ese momento. Pues bien, ahora me encuentro en  una situación similar a la de entonces y lo que necesito es obtener la ruta de mi aplicación, pero en un formato adecuado para crear/modificar/eliminar archivos allí, es decir, para usar la librería System.IO.File.


Una forma para conocer la ruta es la que más se encuentra si "googleas" un poco:


System.Reflection.Assembly.GetExecutingAssembly(). GetName().CodeBase


Pero te devuelve la ruta en este formato: 
file://C:/Users/...
Con lo cual no es útil para lo que yo lo necesito. Entonces si lo que quiero es obtener la ruta en este formato:
C:\Users\Admin\...
Tengo que hacerlo de esta forma:


Environment.CurrentDirectory


Y con esto ya tengo solucionado el problema. Es similar al App.Path de Visual Basic, fácil de recordar y útil para usar la ruta.




Espero que la próxima vez que tenga que buscar esto mire antes en mi blog :)

Método IsDate como extensor de String

Tras leer un árticulo en la web sobre métodos extensores en Visual Studio 2008 y para probar la facilidad de uso de estos he implementado en método IsDate, extensor de String que siempre viene bien para comprobar las cadenas que son fechas válidas. El código quedaría como sigue:

using System;

///
/// Clase que implementa métodos extensores.
///

public static class Extensores
{
///
/// Determina si una cadena es o no una fecha válida.
///

/// Cadena a validar.
///
/// true si la cadena es una fecha válida, sino false.
///

public static bool IsDate(this String cadena)
{
DateTime d;
return DateTime.TryParse(cadena, out d);
}
}

Es decir basta con crear una clase estática con una función estatica IsDate con un parámetro (this String cadena). Con esta nomenclatura le estamos diciendo que el metodo extensor es para la clase String.
He usado la funcion TryParse de DateTime porque según he leido es más eficiente que usar bloques try - catch - finally.
No es muy dificil de implementar pues y el uso seria muy facil puesto que ahora nuestra clase String posee un metodo nuevo al que podremos acceder facilmente:
String.Empty.IsDate()
Esa llamada se evalua como falso ya que la cadena vacia no es una fecha válida.

Problema con ShowBallonTip en Visual Studio 2008

A menudo, en nuestras aplicaciones en .net usamos el NotifyIcon para mostrar información de tareas que estamos realizando o para mostrar cualquier mensaje.

En Visual Studio 2008 hay un pequeño problema, al ponerle que muestre el BallonTip (el globo con la información) con poco tiempo, unos 2 ó 3 segundos, el globo no respeta el tiempo que le hemos especificado y normalmente se pasa, permanece a nuestra vista más tiempo del establecido.

Ejemplo:

notifyIconMain.ShowBalloonTip(2000, "My Text", MyVariable, ToolTipIcon.Info);


Esto es debido a que entra en conflicto con el tiempo por defecto del Sistema Operativo, con la consecuente victoria de éste último, por lo tanto no respeta nuestro tiempo y lo muestra el que tiene establecido el SO.

Otro motivo por el cual ocurre esto es que el globo no desaparece si no hay acciones por parte del usuario. Cuando esto ocurre dicho globo no desaparecerá hasta que haya interacción.

Visual Studio 2008 - Atajo de teclado para el Intelli Sense

A menudo, cuando estamos programando en visual studio requerimos de la ayuda del Intelli Sense, quien nos da las opciones que tenemos para escribir. En Visual Studio 2008 tenemos un truco para sacarlo sin escribir nada. Simplemente tenemos que pulsar:

Ctrl + J

y la ventana de ayuda se desplegará mostrándonos lo que podemos escribir. Esto es muy útil, sobretodo al programar en C#, ya que hasta que no poníamos un punto o empezábamos a escribir no nos ayudaba, y cuando estábamos borrando las propiedades de un objeto teníamos que retroceder hasta el punto y volver a escribirlo para que nos apareciera. Ahora ya no; en cualquier momento tecleamos la combinación de teclas que he puesto arriba y se nos mostrará dicha ayuda.

Otro truco que nos puede ser muy útil es la transparencia del Intelli Sense. Cuando estamos escribiendo hay veces que nos molesta porque estamos copiando código que tenemos debajo, o estamos consultándolo. Pues bien, si nos molesta la ventana de ayuda sólo tenemos que pulsar la tecla Control y se volverá semitransparente, con lo que podremos ver el código sin perder la ayuda.

Ahora ya podemos programar un poquito más rápido, incluso aunque tengamos que escribir el punto y coma.

Un saludo.

Buscar este blog

Seguidores

Blogs amigos

Etiquetas

.net (5) ALTER (2) ATER (1) AUTO (1) c# (6) CATCH (1) CREATE (10) DATABASE (4) DROP (1) EXPLICIT (1) extensores (1) FILEGROUP (1) funciones (2) FUNCTION (2) HTML (1) Instalacion desatendida (1) Joomla (1) metadatos (1) Office 2007 (1) PARTITION (1) PATH (2) PROCEDURE (2) Programación Web (2) RAW (1) Recursos (1) Saludos (1) SCHEMA (1) SCHEME (1) seguridad (1) SELECT (1) Silverlight (1) SNAPSHOT (1) SQL Server (2) SQL Server 2000 (1) SQL Server 2005 (21) T-SQL (3) TABLE (1) timestamp (1) TRAN (1) transacciones (1) TRY (1) TYPE (1) Vista (2) Vistas (1) Visual Basic (2) Visual Basic 6 (1) Visual Studio 2008 (5) Visual Studio 2010 (3) Windows (4) WPF (2) XML (2)