Dienstag, 21. Januar 2014

Thread Synchronisation mit AutoResetEvent

Hat man im Programm mehrere Threads laufen, ist oft wahrscheinlich eine Synchronisierung nötig, heißt: Ein Thread soll erst dann weiterlaufen, wenn ein bestimmtes Ereignis o.ä. eingetreten ist.
Um dieses Warten zu erledigen, könnte man sich einerseits selbst eine Endlosschleife bauen und so auf den Eintritt warten.
Eine einfachere und zugleich effizientere Möglichkeit bietet die Klasse AutoResetEvent. Diese realisiert genau das, sie stellt Funktionen bereit, mit denen ein Thread auf ein Ereignis warten kann. Beim Warten wird der Thread blockiert und schließlich wieder aufgeweckt, wenn das Ereignis eingetreten ist.
Eine Instanz der Klasse AutoResetEvent speichert den aktuellen Zustand des Ereignisses intern, im Konstruktor kann dieser initialisiert werden (false = wartend, true = eingetreten).
Über die Funktion WaitOne() wartet der aktuelle Thread, bis das Ereignis eintritt. Dieses kann mittels Set() signalisiert werden. Reset() löscht das Ereignis dann wieder.
Im folgenden Beispiel startet das Hauptprogramm einen neuen Thread. Dieser wartet in Dauerschleife auf das Eintreten von Event1, welches durch einen Klick auf den Button ausgelöst wird. Bei Eintritt wird dann eine Meldung angezeigt:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace ThreadSynchronization
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private AutoResetEvent Event1 = new AutoResetEvent(false);

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread Thread1 = new Thread(Looper);
            Thread1.Start();
        }

        private void Looper()
        {
            while (true)
            {
                Event1.WaitOne();
                MessageBox.Show("Set");
                Event1.Reset();
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Event1.Set();
        }
    }
}

Kommentare:

  1. Könntest du etwas zum Thema "Optical Character Recognition (OCR)" machen?

    AntwortenLöschen
    Antworten
    1. Coole Sache, schreibe ich demnächst drüber!

      Löschen
    2. Danke! Freue mich schon drauf. :)

      Löschen
    3. http://csharp-tricks.blogspot.de/2014/02/texterkennung-ocr.html
      Gerne, hilft das? :)

      Löschen