Laden...

Thread.Join() Funktion bzw. Alternative

Erstellt von metroid vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.177 Views
M
metroid Themenstarter:in
2 Beiträge seit 2018
vor 6 Jahren
Thread.Join() Funktion bzw. Alternative

Guten Tag zusammen,

ich würde mich als Einsteiger definieren und bastel mir gern mal das ein oder andere Tool, dass mir das Arbeiten am PC erleichtert.
Ich bin nun auf die Thread Funktion gestoßen. Ich arbeite momentan an einem Windows Forms Projekt und klicke auf einen Button. Der Button führt eine Methode in einem neuen Thread aus. Ich möchte nun dass einen MessageBox aufpopt sobald der Thread sein Code abgearbeitet hat. Mach ich dies nun mit Thread.Join und dann die MsgBox dann bleibt wiederum auch das Hauptfenster mit seinem Thread hängen.

Gibt es sowas in der Art wie

Thread.Start();
Thread.Join()
{
string alternative = "und nur die sozusagen eingeklammerte Zeile dem Thread.Join angehängt wird?"
}

und der fortlaufende Code sofort weitergeführt wird?

Es gibt bei mir eine Abfrage und es wird eine der 3 Methodenaufrufe abgearbeitet. Ich möchte, dass egal welche der 3 Methodenaufrufe genommen wird, nach dem Thread eine MsgBox aufpoppt.

Auszug aus Projekt:


private void button_copy_Click(object sender, EventArgs e)
        {
            if (Directory.Exists(textBox_directorySource.Text) && Directory.Exists(textBox_directoryTarget.Text))
            {
                if (checkBox_clear.Checked) clearFolder(textBox_directoryTarget.Text);

                if (checkBox_createFolder.Checked)
                {
                    int x = 1;

                    DirectoryInfo cf = new DirectoryInfo(textBox_directorySource.Text);
                    ogt = textBox_directoryTarget.Text + @"\" + cf.Name;

                    try
                    {
                        Directory.CreateDirectory(ogt);
                        if (Directory.Exists(ogt))
                        {
                            Thread dc1 = new Thread(delegate () { DirectoryCopy(textBox_directorySource.Text, ogt, true); });
                            dc1.Start();
                            dc1.Join();
                            Msgb_Backup();                                               //Aufruf Methode mit MsgBox, bleibt dies so, dann hab ich den Effekt das die MsgBox wie gewollt danach aufpoppt aber
                            x = 0;                                                             //das Button Klick Event stoppt bzw. auch erst fertig ist wenn der Thread fertig ist.
                        }
                    }
                    catch
                    {
                        do
                        {
                            gt = textBox_directoryTarget.Text + @"\" + cf.Name + "_" + Convert.ToString(x);

                            try
                            {
                                Directory.CreateDirectory(gt);
                                if (Directory.Exists(gt))
                                {
                                    Thread dc2 = new Thread(delegate () { DirectoryCopy(textBox_directorySource.Text, gt, true); });
                                    dc2.Start();
                                    dc2.Join();
                                    Msgb_Backup();                                               //Aufruf Methode mit MsgBox, bleibt dies so, dann hab ich den Effekt das die MsgBox wie gewollt danach aufpoppt aber
                                    x = 0;                                                             //das Button Klick Event stoppt bzw. auch erst fertig ist wenn der Thread fertig ist.
                                    
                                }
                            }
                            catch
                            {
                                x = x + 1;
                            }
                        }
                        while (x != 0);
                    }
                }
                else
                {
                    Thread dc3 = new Thread(delegate () { DirectoryCopy(textBox_directorySource.Text, textBox_directoryTarget.Text, true); });
                    dc3.Start();                                                                          //Aufruf Methode mit MsgBox, bleibt dies so, dann hab ich den Effekt das die MsgBox wie gewollt danach aufpoppt aber
                    dc3.Join();                                                                           //das Button Klick Event stoppt bzw. auch erst fertig ist wenn der Thread fertig ist.
                    Msgb_Backup();                                                                           
                }                
            }       
        }

Bei weiteren Infos einfach sagen.

veni vidi vici

2.298 Beiträge seit 2010
vor 6 Jahren

Hallo,

die korrekte herangehensweise wäre aus dem Thread heraus ein Event auszulösen, auf das du reagierst.

Um deinen Code jetzt aber nicht all zu weit außeinander zu reißen wäre mein Vorschlag, dass du aus der Methode "DirectoryCopy" deine Methode "Msgb_Backup()" aufrufst.

In dieser musst du allerdings auf den Threadwechsel mittels Invoke achten.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.170 Beiträge seit 2006
vor 6 Jahren

Hallo,

... oder button_copy_Click als async deklarieren, und jeweils den Teil

                            Thread dc1 = new Thread(delegate () { DirectoryCopy(textBox_directorySource.Text, ogt, true); });
                            dc1.Start();
                            dc1.Join();
 

ersetzen durch

await Task.Run(() => DirectoryCopy(textBox_directorySource.Text, ogt, true));

@metroid, schau Dir lieber gleich async/await und Tasks an, für sowas würde man heute besser keine Threads mehr nehmen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

M
metroid Themenstarter:in
2 Beiträge seit 2018
vor 6 Jahren

@inflames2k, @MarsStein

Vielen Dank für eure Antworten.
Werde gleich nach Feierabend mal euren Tipps nachgehen und dann schreiben wie ich es umgesetzt habe. 🙂

veni vidi vici