Multithreading in Windows Forms

Multithreading in Windows Forms

Die folgende Klasse wurde so aufgebaut, dass das Tick-Event immer im gleichen Thread ausgelöst wird, in dem die Klasse auch instanziiert wurde.
class SimpleTimer
{
    private int m_delay = 100;
    private bool m_running = false;
    private AsyncOperation asyncOp;

    public void Start(int delay)
    {
        if (!m_running)
        {
            m_delay = delay;
            m_running = true;

            asyncOp = AsyncOperationManager.CreateOperation(null);

            Thread thread = new Thread(new ThreadStart(ThreadMethods));
            thread.Start();
        }
        else
        {
            throw new Exception("Timer is already running.");
        }
    }

    public void Stop()
    {
        m_running = false;
    }

    public void ThreadMethods()
    {
        while (m_running)
        {
            if (Tick != null)
            {
                asyncOp.Post(new SendOrPostCallback(delegate(object o)
                {
                    Tick(this, EventArgs.Empty);
                }), null);
            }

            Thread.Sleep(m_delay);
        }
    }

    public event EventHandler Tick;
}

Der Code des Formulars dazu, könnte dann wie folgt aussehen:
public partial class Form1 : Form
{
    SimpleTimer test = new SimpleTimer();

    public Form1()
    {
        InitializeComponent();

        test.Tick += new EventHandler(test_Tick);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        test.Stop();
    }

    void test_Tick(object sender, EventArgs e)
    {
        label1.Text = DateTime.Now.Ticks.ToString();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        test.Start(250);
    }

    private void button2_Click(object sender, EventArgs e)
    {
        test.Stop();
    }
}
Um einen Kommentar zu hinterlassen, ist eine Anmeldung erforderlich.