Skip to content

Instantly share code, notes, and snippets.

@johnnykv
Created August 24, 2011 11:38
Show Gist options
  • Save johnnykv/1167889 to your computer and use it in GitHub Desktop.
Save johnnykv/1167889 to your computer and use it in GitHub Desktop.
Korrekt manipulering af UI elementer fra en separat tråd.
//Johnny Vestergaard - 2011
//Et eksempel på _korrekt_ manipulering af et UI element
//fra en separat tråd.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace ThreadsAndGui
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Start "startTraadMetod" i en ny tråd.
Thread lameThread = new Thread(startTraadMetode);
lameThread.Start();
}
void startTraadMetode()
{
SetLabelText("Ugh!");
}
//Signatur til vores delegate, se evt mere om Delegates på LearnDevNow
delegate void SetTextCallback(string text);
//Denne metodes kaldes af vores nye tråd som blev oprettet i button1_Click
private void SetLabelText(string text)
{
//Kontroller om tråden som har kaldt denne funktion er den samme tråd
//som vores label befinder sig i (altså UI tråden).
if (this.label1.InvokeRequired)
{
//Delegate som peger på... denne metode...
SetTextCallback blah = new SetTextCallback(SetLabelText);
//Invoke bevirker at vi beder den tråd som ejer
//label1 om at eksekvere SetLabelText metoden for os.
label1.Invoke(blah, new object[] { text });
}
else
{
//Efter SetTextLabel metoden er kaldt vha. label1.Invoke
//ender vi her fordi det nu rent faktisk er UI tråden der kalder. (this.label1.InvokeRequired er false)
label1.Text = text;
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment