Threads con C#

Cuando desarrollas con dispositivos que se comunican con el ordenador es necesario trabajar creando hilos de ejecución (threads). Un buen programador de dispositivos debe dominar la programación paralela. Utilizar threads nos permitirá hacer tareas de forma simultánea (concurrentemente).

Crear un hilo de ejecución en C# es muy simple. La plataforma .NET nos facilita todo el trabajo y nos libera de la complejidad de hacer lo mismo por ejemplo con C++.

Solo es llamar a la función que queremos que trabaje en otro hilo utilizando la clase Thread y el método Start. Por ejemplo:

using System.Threading;

public void Start_Device()
{
    Thread hilo = new Thread(maquinaEstados);
    hilo.Start();
}

private void maquinaEstados()
{
     While (!mStop)
     {
        // ..................
     }
}

Este método Start_Device, que puede pertenecer por ejemplo a una clase llamada Printer, creará el hilo de una máquina de estados, que controla por ejemplo la comunicación con el dispositivo. Este código simple es la base para que podáis crear vuestros dispositivos.
Desde la función maquinaEstados lanzarás todos los eventos necesarios que quieras que sean escuchados por tu aplicación.
Cuando trabajas con Threads y quieres mostrar por ejemplo algún dato devuelto por un evento en un WinForm es muy común ver este error:

El error que nos retorna es del tipo InvalidOperationException, con el mensaje “Operación no válida a través de subprocesos: Se tuvo acceso al control ‘Form1’ desde un subproceso distinto a aquel en que lo creó.”

En Internet quizá encontrareis algunas soluciones más complicadas que otras. Pero esto se resuelve muy simple colocando lo que quieres mostrar dentro del siguiente bloque:

Invoke(new MethodInvoker(delegate
{

      //  Ejemplo: Mostrar datos de los eventos 
      // enviados por el Thread en una ListBox

}));

Este bloque no requiere de nada más y trabaja con todos los controles. Incluso con un ListBox (esto lo menciono porque encontré muchos post en internet de un error cuando Threads con ListBox en C#).

Convertir un Array de Bytes al equivalente ASCII

En ccTalk y en otras ocasiones nos interesa convertir un array de bytes en una sola cadena de texto, en el que cada byte es el equivalente ASCII.

Por ejemplo:
Data: 067, 111, 105, 110, 032, 065, 099, 099, 101, 112, 116, 111, 114
El equivalente es: Coin Acceptor

Esto lo conseguimos con la siguiente función:

public static string getCadenaEquivalenteASCII(byte[] Data)
{
    string cadenaConvertida = string.Empty;

    if (Data != null && Data.Length > 0)
    {
        Char[] asciiChars = Encoding.ASCII.GetChars(Data);
        cadenaConvertida = new string(asciiChars, 0, Data.Length);
    }
    return cadenaConvertida;
}