C# Ungültiger threadübergreifender Vorgang

Squicky

Lt. Commander
Registriert
Sep. 2002
Beiträge
1.433
Hallo

Ich spiele etwas mit C# rum und habe ein Thread Problem.

Ein neuer Thread soll einen Button bearbeiten. Dabei erhalte ich einen Fehler.
Im Internet habe ich gelesen, das die Lösung "Invoke" ist. Aber so richtig habe ich es nicht verstanden.

Hier ein kleines Beispiel für den Fehler (Eine Form mit einem Button):
Code:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread x = new Thread(new ThreadStart(thread_start));
            x.IsBackground = true;
            x.Start();
        }

        private void thread_start()
        {
            button1.Text = ":-)";
        }
    }


Was wäre die einfachste und schnellst Lösung?
Und was wäre die sauberste und aus Entwicklersicht beste Lösung?


Danke
 
Hi,

Ähnliches Thema bei Microsoft. Was er mit der Textbox macht kannst du dann im Endeffekt mit was anderem machen, "Invoke" stimmt schon. Sauber ist das aber für mein Empfinden nicht, dann eher in WPF mit Bindings arbeiten und nicht direkt von einem Thread die GUI eines anderen verändern.

VG,
Mad
 
Die schnellste Lösung die mir gerade einfällt wäre das hier:

Code:
public delegate void emptyFunction();
public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }
     
  private void button1_Click(object sender, EventArgs e)
  {
    Thread x = new Thread(new ThreadStart(thread_start));
    x.IsBackground = true;
    x.Start();
  }
     
  private void thread_start()
  {
    button1.Invoke(new emptyFunction(delegate() { button1.Text = ":-)"; }));
  }
}

Die ThreadStart Instanz kannst du dir im übrigen sparen. So gehts auch:
Code:
Thread x = new Thread(() => thread_start());

Edit: Es gibt Invoke() und BeginInvoke(). Du kannst in deinem Beispiel beides nehmen. Bei Invoke wartet der Thread bis die Aufgabe durchgeführt wurde. Bei BeginInvoke macht der Thread sofort mit dem nächsten Befehl weiter.
 
Zuletzt bearbeitet:
Ist es nicht so, dass du deinen eigenen Thread (x) per Invoke mit dem Main(GUI)-Thread synchronisierst? In dem Fall ist das Beispiel ziemlich sinnfrei, da der Thread überhaupt keinen Vorteil bringt. :D
Das aber nur mal so am Rande. Rein technisch ist die Lösung korrekt.
 
Spricht etwas dagegen in C# den BackgroundWorker zu verwenden?

Da wird glaube ich auch klarer, was welcher Thread macht und man kann die Handles leicht verwalten.
 

Ähnliche Themen

Zurück
Oben