Ir al contenido principal

tips: Threading - Consideraciones y buenas practicas.

Este es el primero de, esperemos, una larga serie de tips, guidelines, practicas recomendables, o como quiera llamarse, sobre porciones de código (en c# por lo pronto) recurrentemente utilizadas.
Estos posts no respetaran orden alguno, ni periodicidad, pero si esperamos sean útiles.

Threading
El Microsoft .Net framework ofrece varios modos de ejecutar operaciones en diferentes hilos (threads).
Algunos de ellos:

  • Mediante el objeto Thread:
    Namespace: System.Threading


    Thread thOperacion1 = new Thread(new ThreadStart(metodo));
    thOperacion1.Start();


  • Mediante el uso de ThreadPool:
    Namespace: System.Threading


    ThreadPool.QueueUserWorkItem(new WaitCallback(metodo));


  • Mediante el uso de Timers:
    Permiten ejecutar métodos en intervalos de tiempo dados.
    Namespace: System.Threading


    TimerCallback callback = new TimerCallback(metodo);
    Timer stateTimer = new Timer(callback,null,0,1000);





Consideraciones para el uso del objeto Thread

En aplicaciones de muchos hilos, y poco acceso a entrada y salida, es recomendable utilizar el método Sleep con 0 (cero) como argumento para hacer un cambio de contexto en la ejecución y obligar al thread a "salir del CPU".

Para tareas de baja prioridad se debe dar el valor true a la propiedad IsBackground.

Para sincronizar y aseguramos que dos threads no accederán a un recurso, o porción de código, al mismo tiempo, se debe utilizar el bloque lock. Si es necesario indicar cierto timeout al lockeo, se puede utilizar Monitor.

Continuara...

Comentarios

Entradas más populares de este blog

[links] Links para descargas de Visual Studio 2008 SP1, Framework .NET 3.5, su SP1 y Sql Server Express 2008

En el proceso de modernizacion de los entornos de desarrollo que comunmente uso para trabajar, acumule estos links de descargas, que paso a compartir para ahorarle la busqueda a algun colega:

Microsoft .NET Framework 3.5 [web] 197.12 MB

Requerimientos:Windows Server 2003Windows Server 2008Windows VistaWindows XP256 MB de RAM500 MB de espacio disponible en disco



Microsoft .NET Framework 3.5 Service Pack 1 [web] 231.5 MB

Requerimientos:Windows Server 2003Windows Server 2008Windows VistaWindows XP256 MB de RAM500 MB de espacio disponible en disco



Windows Installer 4.5 Redistributable - Español [Windows Server 2003] [web] 3.2 MB

Requerimientos:Windows Server 2003 Service Pack 1Windows Server 2008Windows VistaWindows XP Service Pack 2



Microsoft Visual Studio 2008 Service Pack 1 (iso) [web] 913.79 MB

Requerimientos:Windows Server 2003Windows Server 2008Windows VistaWindows XP1024 MB de RAM



Microsoft SQL Server 2008 Express [web] 99.2 MB

Requerimientos:Windows Server 2003 Service Pack 2Windows Server …

Pruebas de desempeño - XML Webservices

En esta oportunidad, el desacoplamiento al que llegamos nos permite traspasar las barreras de la organizacion. Nuestro servicio de suma, ahora lo proporciona un Werbservices. Por lo tanto, podria estar fuera nuestra bateria de servidores, y la aplicacion funcionaria igual. Por lo menos en resultado, no en prestaciones.
Los cambios:

Agregamos en Web services al proyecto, con este codigo en el ASMX.



using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
publicclass Servicio : System.Web.Services.WebService
{

public Servicio(){}

[WebMethod]
publiclong sumar(long n)
{
return ++n;
}

}

Incluimos la referencia WEB a nuestro WS, y estos cambios en la aplicacion.



using System;
using System.Collections.Generic;
using System.Configuration; // Agregar referencia System.Configuration 2.0
using System.IO;
using System.Text;
using System.Th…

Pruebas de desempeño - En otro DLL

Agregamos otro proyecto a la solución, del tipo libreria, en la que ubicaremos el servicio de suma.



using System;
using System.Collections.Generic;
using System.Text;

namespace Sumador
{
publicclass Servicio
{
publicstaticlong sumar(long n)
{
return ++n;
}
}
}


El código anterior modificado para esta prueba:



using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;

namespace Tester
{
class Program
{
privatestaticbool iterar = true;
staticvoid Main(string[] args)
{
int duracion = 1000;

Console.Write("Nombre de la prueba:");
string nombre = Console.ReadLine();

Console.WriteLine();
Console.WriteLine("Presione una tecla para iniciar la prueba");
Console.ReadKey();

Console.WriteLine("Finalizar prueba cada {0} milisegundos",duracion);


short i = 0;
using(StreamWriter sw = File.AppendText(string.Format("{0}.txt",nombre.Replace(' ','_')…