errox Geschrieben 11. Oktober 2009 Geschrieben 11. Oktober 2009 Hallo. Ich möchte gerne eine Anwendung von mir erweitern. Dazu benötige ich mehrere Threads. Aber ich scheitere schon ein einem Kleinen Thread: public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(ThreadProc)); t.Start(); } public void ThreadProc() { for (int i = 0; i < 100; i++) { progressBar1.Value = i; Thread.Sleep(100); } } Ich habe eine Progressbar. Wenn ich die Value der Progressbar erhöhe mit einem Sleep, hängt sich die Anwendung so lange auf, bis die Schleife abgeschlossen ist. Desshalb will ich diese Aktion in ein Thread auslagern. Leider klappt das nicht. Der Vorgang ist "Threadübergreifend". Was das genau bedeutet, weiss ich selbst nicht so genau. Jedenfalls wäre es Super, wenn das klappen würde. Das wäre ein guter Ansatz für mich, größere Aufgaben in Threads zu unterteilen. Zitieren
JasonDelife Geschrieben 11. Oktober 2009 Geschrieben 11. Oktober 2009 Man darf in .NET nicht von jedem Thread auf Controls zugreifen! Genauer gesagt: Nur von einem einzigen, dem GUI-Thread. Zugriffe auf Controls muss man immer in den GUI-Thread auslagern. Dazu gibt es [begin]Invoke(Delegate). Je nach Szenario, ist es einfacher, den BackgrundWorker zu nutzen. Grüße, JasonDelife. Zitieren
errox Geschrieben 11. Oktober 2009 Autor Geschrieben 11. Oktober 2009 private void button1_Click(object sender, EventArgs e) { backgroundWorker1 = new BackgroundWorker(); backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); backgroundWorker1.RunWorkerAsync(); } private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 100; i++) { progressBar1.Value = i; Thread.Sleep(100); } } Also hier passiert leider nichts Zitieren
JasonDelife Geschrieben 11. Oktober 2009 Geschrieben 11. Oktober 2009 Der BackgrundWorker befreit nicht von der Pflicht, Control-Zugriffe in den GUI-Thread zu verlagern. Er erleichtert es lediglich. (ReportsProgress + ProgressChanged) Grüße, JasonDelife. Zitieren
errox Geschrieben 11. Oktober 2009 Autor Geschrieben 11. Oktober 2009 Wieso ist es ( selbst in .NET ) so kompliziert das zu Verwalten? Im internet finde ich leider expliziet keine Beispiele dazu, was ich suche Zitieren
JasonDelife Geschrieben 11. Oktober 2009 Geschrieben 11. Oktober 2009 Wieso ist es ( selbst in .NET ) so kompliziert das zu Verwalten? Weil Threading nunmal nicht einfach ist. Und in .NET ist es eigentlich recht einfach. Vllt. hilft dir das: BackgroundWorker-Klasse (System.ComponentModel) Gewusst wie: Ausführen eines Vorgangs im Hintergrund Empfohlene Vorgehensweise für das verwaltete Threading Wenn nicht, musst du uns genauer beschreiben, was du tun willst. Grüße, JasonDelife. Zitieren
Hahne Geschrieben 12. Oktober 2009 Geschrieben 12. Oktober 2009 Hahne.NET : Progressbar im Backgroundworker ansprechen Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.