Threadsichere Event unter C#

Events unter C# sind so eine Sache. Im Normalfall funktionieren sie ohne Probleme. Spannend wird das ganze wenn man Events in einer Anwendung zwischen verschiedenen Threads verschicken möchte. Dabei kann es nämlich passieren das Events verloren gehen weil sie nicht empfangen werden. Abhilfe schafft hier die Klasse „ThreadSafeEvent“:

public class ThreadSafeEvent
{
  EventHandler internalEventHandler;
  readonly object internalEventHandlerLock=new object();

  public event EventHandler Event
  {
    add
    {
      lock(internalEventHandlerLock)
      {
        internalEventHandler+=value;
      }
    }
    remove
    {
      lock(internalEventHandlerLock)
      {
        internalEventHandler-=value;
      }
    }
  }

  public virtual void Fire(object sender, EventArgs e)
  {
    EventHandler handler;

    lock(internalEventHandlerLock)
    {
      handler=internalEventHandler;
    }

    if(handler!=null)
    {
      handler(sender, e);
    }
  }
}

Möchte man nun z.B. der Klasse „Entries“ eine solches Event hinzufügen, so sieht das ganze wie folgt aus:

public ThreadSafeEvent EntrySelected=new ThreadSafeEvent();

Nun kann das Event gefeuert werden, das ganze wird mittels der „Fire“ Methode bewerkstelligt. Dieser übergibt man den Sender und zusätzliche Argumente in Form eines „EventArgs“ bzw. einer davon abgeleiteten Klasse.

EntrySelected.Fire(this, new EntryEventArgs(entry));

Jede Klasse welche das Event nun empfangen möchte hängt sich an das entsprechende Event.

Entries entries=new Entries();
Entries.EntrySelected.Event+=OnEntrySelected;

...

private void OnEntrySelected(object sender, EventArgs e)
{
  EntryEventArgs args=(EntryEventArgs)e;
  Console.WriteLine(args.Entry);
}

Und schon haben wir in unserer Anwendung ein sauberes und threadsicheres Eventsystem.

Auf „protected“ und „private“ Eigenschaften unter C# zugreifen

Im Normalfall hat es gute Gründe das man auf bestimmte Eigenschaften einer Klasse nicht zugreifen kann. Manchmal ist es aber dennoch nützlich genau dies zu tun. So zum Beispiel bei der „NetworkStream“ Klasse welche im .NET/Mono Framework zu finden ist. Diese hat dabei die Eigenschaft „Socket“ welche „protected“ ist. Möchte man nun doch auf diese Eigenschaft zugreifen, so muss man zu etwas Magie in Form von Reflection greifen:

NetworkStream stream;
...
PropertyInfo pi=stream.GetType().GetProperty("Socket", BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance);
Socket socket=(Socket)pi.GetValue(stream, null);

Hier holt man sich mittels Reflection die Eigenschaft und castet sie. Anschließend hat man dann in der Variable „socket“ die entsprechende Eigenschaft und kann mit dieser dann machen was man möchte.

MonoDevelop und das Auswerten von Ausdrücken

Vor einiger Zeit hatte ich einen Artikel darüber geschrieben, was mich an MonoDevelop stört. Seit heute gibt es da noch eine weitere Sache. So kann man in MonoDevelop Ausdrücke und Variablen auswerten, was bei der Entwicklung doch sehr praktisch ist.

Das Fenster zum Überwachen von Ausdrücken und Variablen

Das Fenster zum Überwachen von Ausdrücken und Variablen

Problematisch wird es dann, wenn das Fenster dazu verleitet nach Fehlern zu suchen, die eigentlich nicht existent sind. So kürzt es automatisch den Wert der überwachten Variable ein. Selbst wenn man auf „Kopieren“ drückt, wird nur die gekürzte Fassung in die Zwischenablage geschoben. Dadurch kann es dann passieren das man anstatt:

"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

den Wert:

"ABCDEFGHIJKLMNOPQRS..."

auswertet. Möchte man an dieser Stelle ganz sicher sein, so hilft nur der umständliche Weg über die Lupe, in welcher der ganze Wert in einem extra Fenster angezeigt wird.

Keypass für Mac OS X

Bei Keypass handelt es sich um einen freien Passwortmanager (GPL) welcher für Windows, Linux und Mac OS X verfügbar ist. Unter Windows und Linux läuft das ohne Probleme nur unter Mac OS X ist die Oberfläche nicht bedienbar. Abhilfe schafft hier der Fork KeePassX.

KeyPassX in der neusten Alphaversion

Mit diesem ist es in der neusten Alphaversion auch möglich die neue Version 2 der Datenbankdateien zu lesen. Der entsprechende Download dafür ist unter http://www.keepassx.org/dev/projects/keepassx/files zu finden.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/KeePass
http://www.keepassx.org/news/2012/10/367

Libtiff und libjpeg für .NET/Mono

Bei Libtiff und libjpeg handelt es sich um zwei oft verwendete Bibliotheken zum lesen von TIFF und JPG Dateien. Die Biblitheken liegen dabei als C-Quelltext vor. Auf der Suche nach einer entsprechenden .NET Portierung bin ich auf der Seite http://bitmiracle.com/ fündig geworden. Dort gibt es .NET Portierungen der Bibliotheken unter der „New BSD license“. Augenscheinlich werden die Bibliotheken auch aktuell gehalten, so das der Abstand zwischen den Originalen nicht zu groß wird.

Weitere Informationen gibt es unter:
http://en.wikipedia.org/wiki/Libtiff
http://en.wikipedia.org/wiki/Libjpeg