Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Threading Kommunikation zwischen Form und (abzubrechender) langlaufender Aktion
i06001
myCSharp.de - Member



Dabei seit:
Beiträge: 24

Themenstarter:

Threading Kommunikation zwischen Form und (abzubrechender) langlaufender Aktion

beantworten | zitieren | melden

Hallo zusammen,

ich habe folgendes Problem:

Ich habe 3 Klassen -
- eine Klasse Form1, auf der ein DataGridView, eine Textbox in der ein Suchwort eingetragen werden kann und ein Button, der die Suche startet, platziert sind
- eine Klasse Mittelung, die nichts weiter ist als ein Fenster mit "Abbrechen" Button
- eine Klasse Suche, die mir die Suche auf dem DataGridView durchführt

Die Suche funktioniert ohne Probleme - ich möchte jedoch mit der Klasse Mitteilung die Suche jederzeit abbrechen können, falls dem User die Suche zu lange dauert.

Die Klasse Form1 ruft zuerst die Klasse Mittelung in einem eigenen Thread auf und führt dann die Suche durch


                MitteilungBox mitteilungBox = new MitteilungBox();
                mitteilungBox.FormClosing += new FormClosingEventHandler(mitteilungBox_FormClosing);

                ThreadStart starter = null;
                starter = delegate { mitteilungBox.ShowDialog(); };
                thread = new Thread(starter);
                thread.Start();
                
                search = new Search(dataGridViewTable);
                search.Find(comboBoxSearchFor.SelectedItem.ToString(), textBoxSearchtext.Text);


Wie teile ich jedoch nun meiner aktiven Suche mit, dass in dem Fenster der Klasse Mitteilung der "Abbrechen" Button gedrückt wurde?
Hier ein Ausschnitt der Suchklasse:


                for (int i = startIndex; i < dgv.Rows.Count; i++)
                {
                    if (AbortSearch)
                    {
                        AbortSearch = false;
                        dgv.BindingContext[dgv.DataSource, dgv.DataMember].Position = i;
                        break;
                    }
                    DataGridViewRow row = dgv.Rows[i];
                    string val = row.Cells[column].Value as string;
                    if (val.Contains(key))
                    {
                        dgv.ClearSelection(); row.Selected = true;
                        dgv.BindingContext[dgv.DataSource, dgv.DataMember].Position = i;
                        return;
                    }
                }

Ich stehe momentan ein wenig aufm Schlauch - ich hoffe ich konnte es einigermaßen verständlich machen was ich will :)

Wäre super wenn man mir helfen könnte - im Voraus vielen Dank!

MfG
i06001
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 916

beantworten | zitieren | melden

Du könntest ein Event implementieren welches die Abbrechen Klasse feuert und die Klasse die den Thread startet abonniert. Nach dem feuern einfach das interne Flag auf true setzen, und die Thread bricht ab indem er seine Ihm zugeteilte Methode verlässt.
Again what learned...
private Nachricht | Beiträge des Benutzers
serial
myCSharp.de - Member



Dabei seit:
Beiträge: 902

beantworten | zitieren | melden

HAllo,

du solltest das etwas anders lösen:

Ich halte es für besser, wenn die eigentliche Aufgabe in einen seperaten Thread kommt, und NICHT das öffnen eines Dialoges.

Starte in Form1 deine Suche in einem eigenen Thread und öffne aus Form1 heraus danach den Dialog.
Wenn Abbrechen geklickt wurde, wurde dies per Event an Form1 mitgeteilt, welches eine Abbruchvariable auf true setzt.
Der Thread, welcher die Suche ausführt, sollte diese VAriable prüfen, und ggf abbrechen.

Noch besser wäre es wohl, einfach den BackgroundWorker zu verwenden.

Wenn du .net 4 verwendest, kannst du die Suche in einem Task starten lassen, und von Form1 aus eine CancellationToken setzen.

mfg
serial
private Nachricht | Beiträge des Benutzers
i06001
myCSharp.de - Member



Dabei seit:
Beiträge: 24

Themenstarter:

beantworten | zitieren | melden

Hallo,

vielen Dank für eure Antworten!

Also mit dem BackgroundWorker funktioniert es super.
Habe mich bis jetzt immer von dem BackgroundWorker ferngehalten - wie ich bemerke vollkommen grundlos....
Na ja, komme vom Land - und was der Bauer nicht kennt .... :-)

MfG
i06001
private Nachricht | Beiträge des Benutzers